home *** CD-ROM | disk | FTP | other *** search
/ PC-SIG Library 8 / PC-SIG Library CD-ROM (8th Edition) (1990-04).iso / 001_100 / disk0081 / modem.asm < prev    next >
Encoding:
Assembly Source File  |  1982-08-30  |  55.2 KB  |  2,239 lines

  1.     TITLE    'MODEM FOR THE IBM PERSONAL COMPUTER: PC/DOS'
  2.     PAGE     63,132
  3. ;
  4. ;*    M  O  D  E  M   - -   FOR THE IBM PERSONAL COMPUTER       *
  5. ;*                                                              *
  6. ;*    This program was developed from                           *
  7. ;*         MODEM.ASM  (Version 3.0)                             *
  8. ;*         for CP/M to CP/M file transfers                      *
  9. ;*      BY Ward Christensen         (CPM-UG Disk # 25)          *
  10. ;*    Refer to the last section of this source file for         *
  11. ;*    a complete modification history and credits to            *
  12. ;*    those who contributed to this version.                    *
  13. ;*                                                              *
  14. ;* N O T I C E                                                  *
  15. ;*    This program is supplied for your personal and            *
  16. ;*    non-commercial use only. No commercial use permitted.     *
  17. ;*    Users of this program are granted limited rights to       *
  18. ;*    reproduce and distribute this program, provided           *
  19. ;*    the following conditions are met:                         *
  20. ;*                                                              *
  21. ;*    1) This program must be supplied in original form,        *
  22. ;*       with no modifications.                                 *
  23. ;*    2) Notices contained in this source file, and those       *
  24. ;*       produced by the executable program, must not be        *
  25. ;*       altered or removed.                                    *
  26. ;*    3) This program may not be sold. Providing this           *
  27. ;*       program for consideration of any sort, including       *
  28. ;*       copying or distribution fees, is prohibited.           *
  29. ;*    4) This program may not be used on timesharing            *
  30. ;*       systems where fees are charged for access,             *
  31. ;*       or or supplied as part of any other form of            *
  32. ;*       rental access computing, without the express           *
  33. ;*       written permission of the author.                      *
  34. ;*                                                              *
  35. ;*    PLEASE SEND PROBLEM REPORTS AND SUGGESTIONS               *
  36. ;*    TO:     John Chapman                                      *
  37. ;*            844 S. Madison St.                                *
  38. ;*            Hinsdale, Illinois  60521                         *
  39. ;*            Compuserve = 70205,1217                           *
  40.     SUBTTL    MACRO DEFINITIONS    
  41.     page
  42. ;
  43. DOSCALL    MACRO    FUNCTION,AREA ;INVOKE DOS SERVICE
  44.     IFNB    <AREA>
  45.     MOV    DX,OFFSET AREA    ;SET PARAMETER OFFSET
  46.     ENDIF
  47.     MOV    AH,FUNCTION    ;DOS FUNCTION CODE
  48.     INT    21H        ;INVOKE DOS SERVICE
  49.     ENDM
  50. ;
  51. PRCHAR    MACRO    CHAR    ;PRINT A CHARACTER
  52.     IFNB    <CHAR>
  53.     MOV    DL,CHAR    ;CHAR TO DL REG
  54.     ENDIF
  55.     DOSCALL    DSPLO    ; DOS PRINT CHARACTER FUNCTION
  56.     ENDM
  57. ;
  58. SCROLL    MACRO
  59.     MOV    AX,600H    ;AH=6 SCROLL, AL=0 ENTIRE WINDOW
  60.     INT    10H    ;INVOKE BIOS SCROLL ROUTINE
  61.     ENDM
  62. ;
  63. LOCATE    MACRO
  64.     MOV    AH,2    ;BIOS FUNCTION SELECT
  65.     MOV    BH,0    ;USE SCREEN 0
  66.     INT    10H     ;INVOKE BIOS CURSOR POSITIONING
  67.     ENDM
  68. ;
  69. ;
  70.     SUBTTL    EQUATES
  71.     page
  72. ;
  73. CANFLG    EQU    1           ;NO CANCEL ABILITY
  74. ;
  75. MODSNDB    EQU    020H        ;BIT TO TEST FOR SEND
  76. MODSNDR    EQU    020H        ;VALUE WHEN READY
  77. MODRCVB    EQU    001H        ;BIT TO TEST FOR RECEIVE
  78. MODRCVR    EQU    001H        ;VALUE WHEN READY
  79. ;
  80. BAUDRAT    EQU    0C2H        ;BAUD RATE OUTPUT
  81. DTREADY EQU    01H        ;MCR FLAG FOR DTR UP
  82. ;            
  83. ;ORIGMOD EQU    1DH         ;8 DATA, NO PARITY, ORIG
  84. ;ANSWMOD EQU    1EH         ;8 DATA, NO PARITY, ANSW
  85. ;
  86. INITREQ    EQU    0           ;MODEM INIT. REQ'D?
  87. INITC1    EQU    64H         ;FIRST INIT CHAR TO CTL PORT
  88. INITC2    EQU    64H         ;2ND INIT CHAR TO CTL PORT
  89. ;
  90. FASTCLK EQU    1           ;PUT 1 HERE FOR 4 MHZ CLOCK
  91. ERRLIM    EQU    10          ;MAX ALLOWABLE ERRORS
  92. EXITCHR    EQU    'W'-40H         ;CTL-W EXIT FROM T OR C
  93. DISCCHR    EQU    'D'-40H     ;CTL-D DISCONNECTS MODEM T/C
  94. CTLCCHR EQU    'I'-40H        ;CTL-C REPLACEMENT (temporary)
  95. CTLCHAR EQU    03H        ;CTL-C ACTUAL      (temporary)
  96. ;DEFINE ASCII CHARACTERS USED
  97. ;
  98. SOH    EQU    01H         ;START OF HEADER
  99. EOT    EQU    04H         ;END OF TRANSMISSION
  100. ACK    EQU    06H         ;ACKNOWLEDGE
  101. LF    EQU    0AH         ;LINEFEED
  102. CR    EQU    0DH         ;CARRIAGE RETURN
  103. NAK    EQU    15H         ;NEG ACKNOWLEDGE
  104. CAN    EQU    18H         ;CANCEL
  105. FF    EQU    0CH        ;FORM FEED (clear screen)
  106.     PAGE
  107. ;
  108. ; PC DOS EQUATES (VERSION 1.1)
  109. ;
  110. REIPL    EQU    0        ;PROGRAM TERMINATE
  111. RDCON    EQU    1               ;KEYBOARD INPUT
  112. WRCON    EQU    2               ;DISPLAY OUTPUT
  113. PRTCHR    EQU    5        ;PRINTER OUTPUT, CHAR IN DL
  114. DCON    EQU    6               ;DIRECT CONSOLE I/O
  115. PRINT    EQU    9               ;PRINT STRING
  116. CONST    EQU    11          ;CONSOLE STAT
  117. OPEN    EQU    15          ;0FFH=NOT FOUND
  118. CLOSE    EQU    16          ;    "    "
  119. SRCHF    EQU    17          ;    "    "
  120. SRCHN    EQU    18          ;    "    "
  121. ERASE    EQU    19          ;NO RET CODE
  122. READ    EQU    20          ;0=OK, 1=EOF
  123. WRITE    EQU    21          ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC
  124. MAKE    EQU    22          ;0FFH=BAD
  125. REN    EQU    23          ;0FFH=BAD
  126. STDMA    EQU    26          ;SET DMA
  127. FATADDR EQU    27        ;FILE ALLOCATION TABLE ADDRESS
  128. ;
  129. ;
  130. ; d o s   f u n c t i o n s 
  131. ;
  132. ;
  133. DSPLO    EQU    2
  134. PSTRING    EQU    9
  135. DRESET    EQU    0DH    
  136. SELDSK    EQU    0EH
  137. SRCHF    EQU    11H
  138. SRCHN    EQU    12H
  139. CDISK    EQU    19H
  140. SETDTA    EQU    1AH
  141. FATADDR    EQU    1BH
  142. SETINTV    EQU    25H
  143. GETDATE    EQU    2AH
  144. GETTIME    EQU    2CH
  145. ;
  146. ;
  147. ;
  148. ; PC DOS FCB EQUATES (VERSION 1.1)
  149. ;
  150. INT20H    EQU    DS:00H
  151. FCB    EQU    DS:5CH
  152. FCBNAME    EQU    DS:5DH
  153. FCBEXT    EQU    DS:65H
  154. FCBSZL     EQU    DS:6CH
  155. FCBSZH    EQU    DS:6DH
  156. FCBCR      EQU    DS:7CH
  157. FCBRR     EQU    DS:7DH
  158. FCB2       EQU    DS:6CH
  159.     SUBTTL    'PREFIX, CONSTANTS AND WORKAREA'
  160.     PAGE
  161. MODEM      SEGMENT PUBLIC 'CODE'
  162.         ASSUME  CS:MODEM,DS:MODEM,ES:MODEM
  163. ;
  164. ;       ----------------
  165. ;       START OF ACTUAL PROGRAM AREA 
  166. ;    ----------------
  167.         ORG     100H
  168. MAIN    PROC    FAR
  169.     JMP    STARTS
  170. OPTION    DB    0           ;PRIMARY OPTION
  171. ;
  172. ;DATAFLG IS USED BY THE "V" SUBCOMMAND -
  173. ;IT IS 0 WHEN A HEADER OR CKSUM IS BEING
  174. ;SENT/RCD, AND 1 IF "VIEWABLE" DATA (THE
  175. ;SECTOR ITSELF) IS
  176. ;
  177. DATAFLG    DB    0           ;AT HEADER, FIRST
  178. ;
  179. ;
  180. ;SUB-OPTION TABLE.  IF AN OPTION IS IN EFFECT,
  181. ;    THE CHARACTER IS SET TO BINARY 0
  182. ;
  183. OPTBL    EQU    OFFSET $ 
  184. ANSWFLG DB    'A'         ;ANSWER MODE
  185. DISCFLG    DB    'D'         ;DISCONNECT WHEN DONE
  186. ECHOFLG    DB    'E'         ;TO ECHO AFTER XFER
  187. DUMYFLG    DB    'U'        ;DEFAULT UART FLAG
  188. INITFLG DB    'I'        ;TO INIT THE UART / MODEM
  189. ORIGFLG DB    'O'         ;ORIGINATE MODE
  190. QFLG    DB    'Q'         ;QUIET TRANSFER (NO MSGS)
  191. RSEEFLG    DB    'R'         ;SEE WHAT'S RECEIVED
  192. SSEEFLG    DB    'S'         ;SEE WHAT'S SENT
  193. TERMFLG    DB    'T'         ;TO TERM AFTER XFER
  194. VSEEFLG    DB    'V'         ;VIEW MESSAGES (NO HDR, ETC)
  195. urt2flg db    '2'        ;second UART
  196. urt3flg db    '3'        ;third UART
  197. OPTBE    EQU     OFFSET $    ;END OF OPTIONS
  198. ;
  199. TABLESIZE EQU    OPTBE-OPTBL
  200. ;
  201. ;------------------------------------------------------------------
  202. ; ** added for COM1/2/3 Select support for PC              8/82/jac
  203. ;------------------------------------------------------------------
  204. ;
  205. ;
  206. OFFDATP    EQU    0      ;DATA PORT                 OFFSET
  207. OFFCTLP    EQU    5      ;MODEM STATUS REGISTER     OFFSET
  208. OFFCTL2 EQU    4      ;MODEM CONTROL REGISTER    OFFSET
  209. OFFCTL3    EQU    3      ;LINE CONTROL REGISTER     OFFSET
  210. ;                                                       
  211. ;
  212. BASE1U    dw    03f8h    ;base address uart 1 (COM1)
  213. base2u    dw    02F8h   ;base address uart 2 (COM2)
  214. base3u    dw    01F8h   ;base address uart 3 (COM3) ??NOT TESTED??
  215. ;
  216. ;
  217. MODDATP    dw     0      ;3F8H       ;DATA PORT
  218. MODCTLP    dw     0      ;3FDH       ;MODEM STATUS REGISTER
  219. MODCTL2 dw     0      ;3FCH       ;MODEM CONTROL REGISTER
  220. MODCTL3    dw     0      ;3FBH    ;LINE CONTROL REGISTER
  221. ;
  222. ;
  223. RCVSNO    DB    0           ;SECT # RECEIVED
  224. SECTNO    DB    0           ;CURRENT SECTOR NUMBER 
  225. ERRCT    DB    0           ;ERROR COUNT
  226. ;
  227. ;    FOLLOWING 3 USED BY DISK BUFFERING ROUTINES
  228. ;
  229. EOFLG    DB    0           ;EOF FLAG (1=TRUE)
  230. SECPTR    DW    DBUF
  231. SECINBF    DB    0           ;# OF SECTORS IN BUFFER
  232. ;
  233. ;       HELP MSGS 
  234. ;
  235. ;
  236. msg00    db    cr,lf
  237.  db '+---------------------------------------------------------------------+',cr,lf
  238.  db '|                                                                     |',cr,lf
  239.  db '| M  O  D  E  M   - -   FOR THE IBM PERSONAL COMPUTER  (PC/DOS 1.1)   |',cr,lf
  240.  db '|                                                                     |',cr,lf
  241.  DB '|                                      All Rights Reserved            |',cr,lf
  242.  db '|---------------------------------------------------------------------|',cr,lf
  243.  db '|                                                                     |',cr,lf
  244.  db '|  N O T I C E :       Commercial use forbidden.                      |',cr,lf
  245.  db '|                                                                     |',cr,lf
  246.  db '|  This program is provided for personal and non-commercial use only. |',cr,lf
  247.  db '|  Sale is forbidden.         Users of this program are granted       |',cr,lf
  248.  db '|  limited rights to reproduce and distribute this program, provided  |',cr,lf
  249.  db '|  that a) the program is not sold, or provided for consideration     |',cr,lf
  250.  db '|  of any sort, including copying or distribution fees greater than   |',cr,lf
  251.  db '|  the face value of the media and postage. and b) the program is     |',cr,lf
  252.  db '|  provided in unmodified form, with this notice, and all other       |',cr,lf
  253.  db '|  documentation intact.                                              |',cr,lf
  254.  db '|                                                                     |',cr,lf
  255.  db '+---------------------------------------------------------------------+',cr,lf
  256.  db     cr,lf,0,1
  257. ;
  258. ;
  259. MSG01    DB    CR,LF
  260. ;                1234567890123456789012345678901234567890123456789012345678901234567890
  261.     DB    '----  M  O  D  E  M  ----  ',cr,lf,cr,lf
  262.      db     'Converted from  MODEM 3.0 by Ward Christensen     ',cr,lf
  263.     DB    'Sale, or any other commercial use forbidden',cr,lf
  264.     DB    'Version 3.2 for IBM PC/DOS',cr,lf
  265.     DB    '      R  E  A  D  Y        ',cr,lf  
  266.      db    cr,lf,'$',1,0
  267. MSG01A    DB    'File Open, Ready to Receive',CR,LF,0
  268. MSG02    DB    'Awaiting #',0
  269. MSG03A    DB    'h rcd, not soh',CR,LF,0
  270. MSG03    DB    '+++ TIMEOUT +++',0
  271. MSG04    DB    '++ Bad Sector # in Hdr',CR,LF,0
  272. MSG05    DB    '++ CKSUM ++',0
  273. MSG06    DB    'Send # ',0
  274. MSG07    DB    'h rcvd, not ack ',CR,LF,0
  275. MSG08    DB    'Timeout on ack',CR,LF,0
  276. MSG09    DB    'Modem Program Cancelled ',CR,LF,0
  277. MSG10    DB    'File exists, Type Y to erase ',0
  278. MSG11    DB    'Can not open file$'
  279. MSG12    DB    'File open, Extent Length ',0
  280. MSG13    DB    'Awaiting Initial nak',CR,LF,0
  281. MSG14    DB    cr,lf,'Transfer Complete',CR,LF,0
  282. MSG15    DB    cr,lf,'Press Return to Disconnect',0
  283. MSG16    DB    '++ DISCONNECTED ++',0
  284. MSG17    DB    cr,lf,'++ Do not Forget - The Modem is'
  285.     DB    'NOT Disconnected',CR,LF,0
  286. ;    DB    'Use "M3 D" to Disconnect',CR,LF,0
  287. MSG18    DB    'Multiple errors encountered. '
  288.     DB    'Type Q to quit, R to Retry ',0
  289. MSG19    DB    CR,LF,'Press Return to Continue'
  290.     DB    CR,LF,0
  291. MSG20    DB    '++ Unable to Receive Block'
  292.     DB    CR,LF,'++ ABORTING ++$'
  293. MSG21    DB    'Can not Send Sector '
  294.     DB    '- ABORTING',CR,LF,'$'
  295. MSG22    DB    '++ ERROR - Can not make file',CR,LF
  296.     DB    '++ Directory must be full',CR,LF,'$'
  297. MSG22A    DB    '++ Can not Close Files ++$'
  298. MSG23    DB    '++ File Read ERROR ++$'
  299. MSG24    DB    '++ ERROR Writing File ++',CR,LF,'$'
  300. MSG25    DB    'Invalid option on modem command',CR,LF
  301.     DB      'PRESS RETURN FOR HELP, CTL-C IF NOT',CR,LF,1,0
  302. MSG26    DB      'Format for command is',CR,LF,CR,LF
  303.     DB      'MODEM # FILENAME',CR,LF,CR,LF
  304.     DB      'Where # is a 1 character primary option,',CR,LF
  305.     DB      ' which may be followed by sub-options,',CR,LF
  306. ;    DB      ' and by ".xxx" to set baud rate to xxx'
  307.     DB      CR,LF,CR,LF,1
  308.     DB      'Primary Options',CR,LF
  309.     DB      '    S to send a file',CR,LF
  310.     DB      '    R to receive a file',CR,LF
  311.         DB      '    T to act as a terminal',CR,LF
  312.     DB      '    E to act as a computer (echo data)',CR,LF
  313. ;    DB      '    D to disconnect the phone'
  314. ;    DB      '    (S100 modems only)',CR,LF
  315.     DB      '    H to print this help file'
  316.     DB      CR,LF,CR,LF,1
  317.     DB      'Secondary options',CR,LF
  318. ;    DB      '    A answer mode',CR,LF
  319. ;    DB      '    O originate mode',CR,LF
  320. ;    DB      '    D disconnect after execution',CR,LF
  321. ;       DB    '    I initialize uart  to defaults 300,n,8,1',CR,LF
  322.     DB      '    T go to terminal mode after file xfer',CR,LF
  323.     DB      '    E go to echo mode after file xfer',CR,LF
  324.     DB      '    Q quiet mode - no status msgs',CR,LF
  325.     DB      '    R show chars received',CR,LF
  326.     DB      '    S show chars sent',CR,LF
  327.     DB      '    V view file sent/received (no status)',CR,LF
  328. ;    DB    '    2 switch to COM2: - second rs232 port',CR,LF
  329. ;    DB    '    3 switch to COM3: - third  rs232 port',CR,LF
  330.     DB      CR,LF,'FOR EXAMPLES, TYPE MODEM X',CR,LF,1,0
  331. MSG27    DB      'Send file, ',CR,LF
  332.     DB      '    MODEM S fn.ft',CR,LF
  333.     DB      'Send another file',CR,LF
  334.     DB      '    MODEM S fn.ft',CR,LF
  335. ;    DB      'Then send a third file at 450 baud and disconnect'
  336. ;    DB      CR,LF,'    MODEM SD.450 fn.ft',CR,LF
  337.     DB      'Act as a terminal ',CR,LF
  338.     DB      '    MODEM T',CR,LF
  339.     DB      ' Use ctl-D to disconnect)',CR,LF
  340.     DB      'Receive file,  view it',CR,LF
  341.     DB      '    MODEM RV fn.ft',CR,LF,1,0
  342. ;
  343. DBUF    DB    128*16 DUP(?)    ;16 LOGICAL SECTOR BUFFER # 1
  344.                 ;   (* Four physical sectors)
  345.     DB    128*16 DUP(?)    ;16 LOGICAL SECTOR BUFFER # 2
  346.                 ;   (* Four physical sectors)
  347.                 ; TOTAL = one track on PC/DOS (8/512)
  348. ;    DB    'POOT'
  349.     SUBTTL    'MAIN PROGRAM SECTION'
  350.         PAGE
  351. STARTS:
  352. ;
  353. ;=============================================================================
  354. ;
  355. ;       CLEAR THE SCREEN (cursor = 1,1)
  356. ;
  357.     push    dx
  358.     SUB    CX,CX        ;UPPER LEFT CORNER
  359.     MOV    DX,184FH    ;BOTTOM RIGHT CORNER
  360.     MOV    BH,7        ;NORMAL ATTRIB FOR CLS
  361.     SCROLL            ;INVOKE BIOS TO CLEAR SCREEN
  362.     SUB    DX,DX        ;POINT TO ROW 1,COL 1
  363.     LOCATE            ;SET THE CURSOR TO TOP LEFT
  364. ;                   
  365. ;    PRINT THE STARTUP MESSAGE 
  366. ;
  367.            MOV    DX,OFFSET MSG01    ;GET ID MESSAGE
  368.     MOV    CL,PRINT
  369.     CALL    BDOS         ;PRINT ID MESSAGE
  370.     pop    dx
  371. ;
  372. ;=============================================================================
  373. ;
  374. ;
  375. ;SAVE PRIMARY OPTION, VALIDATE SECONDARY OPT.
  376. ;
  377.     CALL    PROCOPT
  378. ;                IF WE RETURN FROM PROCOPT, A VALID
  379. ;            ACTION OPTION (not help or examples)
  380. ;            WAS FOUND .. PROCESSING CONTINUES
  381. ;
  382. ;INIT THE MODEM OR SERIAL PORT   (dtr UP always - THEN CHECK FOR "i" OPT.
  383. ;
  384.     CALL    INITMOD
  385. ;
  386. ;MOVE THE FILENAME FROM FCB 2 TO FCB 1
  387. ;
  388.     CALL    MOVEFCB
  389. ;
  390. ;
  391. ;GOBBLE UP GARBAGE CHARS FROM THE LINE
  392. ;PRIOR TO RECEIVE OR SEND
  393. ;
  394.     PUSH    DX
  395.     MOV    DX,MODDATP
  396.     IN    AL,DX
  397.     IN    AL,DX
  398.     POP    DX
  399. ;
  400. ;JMP TO APPROPRIATE FUNCTION
  401. ;
  402.     MOV    AL,OPTION    ;GET PRIMARY OPTION
  403. ;
  404.     CMP    AL,'C'      ;(COMPAT W/EARLIER
  405.     JNZ    L00001
  406.     JMP    TRMECHO     ;OPTION "COMPUTER")
  407. ;
  408. L00001:    CMP    AL,'E'      ;TERMINAL IN ECHO
  409.     JNZ    L00002
  410.     JMP    TRMECHO     ;..MODE?
  411. ;
  412. L00002:    CMP    AL,'T'            ;TERMINAL..
  413.     JNZ    L00003
  414.     JMP    TERM            ;..MODE?
  415. ;
  416. L00003  LABEL    NEAR
  417. ;    CMP    AL,'D'
  418. ;    JNZ    L00004
  419. ;    JMP    DISCONN
  420. ;L00004  LABEL   NEAR
  421. ;
  422.     CMP    AL,'S'            ;SEND..
  423.     JNZ    L00005
  424.     JMP    SENDFIL            ;..A FILE?
  425. ;
  426. L00005:    CMP    AL,'R'            ;RECEIVE..
  427.     JNZ    L00006
  428.     JMP    RCVFIL            ;..A FILE?
  429. ;
  430. ;INVALID OPTION
  431. ;
  432.  
  433. L00006:    JMP    BADOPT          ;BAD OPTIONS !
  434. ;
  435. ;RETURN TO PC DOS VIA INT 20H IN SEGMENT PREFIX
  436. ;
  437. EXIT:    PUSH    ES        ;SET RETURN SEGMENT TO STACK
  438.     SUB    AX,AX        ;CLEAR A REGISTER
  439.     PUSH    AX        ;PUT ZERO RETURN ADDR TO STACK
  440.     RET            ;FAR RETURN TO FORCE CS TO ...
  441. MAIN    ENDP                    ;.. POINT TO SEGMENT PREFIX
  442. ; * * * * * * * * * * * * * * * * * * * *
  443. ;                    *
  444. ;    TERM: TERMINAL MODE        *
  445. ;                    *
  446. ; * * * * * * * * * * * * * * * * * * * *
  447. ;
  448. ;THIS PROGRAM SIMPLY SENDS KEYED CHARACTERS
  449. ;DOWN THE LINE, AND DISPLAYS CHARACTERS
  450. ;RECEIVED FROM THE LINE.  THIS MAKES IT
  451. ;SUITABLE FOR COMMUNICATION WITH TIME SHARING
  452. ;COMPUTERS, CBBS'S, OR ANOTHER PROGRAM
  453. ;RUNING "MODEM E" (ECHO MODE)
  454. ;
  455. ;TYPEZZ THE "EXITCHR" (ORIGINALLY CTL-E) TO EXIT.
  456. ;OR THE "DISCCHR" (ORIGINALLY CTL-D) TO DISCONN.
  457. ;
  458. ;A FUTURE ENHANCEMENT WILL BE TO WRITE THE
  459. ;RECEIVED DATA IN MEMORY, AND ALLOW IT TO
  460. ;BE WRITTEN TO DISK
  461. ;
  462. TERM    PROC    NEAR
  463.          CALL    STAT            ;LOCAL CHAR KEYED?
  464.     JNZ    L00007
  465.     JMP    TERML         ;..NO, CHECK LINE
  466. L00007:    CALL    KEYIN       ;GET CHAR
  467.     CMP    AL,EXITCHR    ;TIME TO END?
  468.     JNZ    L00008
  469.     JMP    CKDIS            ;YES, CK DISCONN
  470. L00008:    CMP    AL,DISCCHR    ;DISCONNECT REQUEST?
  471.     JNZ    L00009
  472.     JMP    DISCONN            ;YES, DO IT
  473. L00009: PUSH    DX
  474.     MOV    DX,MODDATP
  475.     OUT    DX,AL            ;SEND THE CHAR
  476.     POP    DX
  477. ;
  478. ;SEE IF CHAR FROM LINE
  479. ;
  480. TERML:    PUSH    DX
  481.     MOV    DX,MODCTLP
  482.     IN    AL,DX            ;READ STATUS
  483.     POP    DX
  484.     AND    AL,MODRCVB    ;ISOLATE BIT
  485.     CMP    AL,MODRCVR    ;READY?
  486.     JZ    L00010
  487.     JMP    TERM        ;..NO, LOOP
  488. L00010: PUSH    DX
  489.     MOV    DX,MODDATP
  490.     IN    AL,DX       ;READ DATA
  491.     POP    DX
  492.     CALL    TYPEZZ      ;TYPEZZ IT
  493.     JMP    TERM        ;LOOP
  494. TERM    ENDP
  495. ; * * * * * * * * * * * * * * * * * * * *
  496. ;                    *
  497. ;    TRMECHO: TERMINAL WITH ECHO    *
  498. ;                    *
  499. ; * * * * * * * * * * * * * * * * * * * *
  500. ;
  501. ;TERMINAL PROGRAM WITH ECHO - SEE NOTES
  502. ;UNDER "TERM" ABOVE
  503. ;
  504. ;C A U T I O N   DON'T RUN WITH BOTH COMPUTERS
  505. ;IN "ECHO" MODE - LINE ERRORS (OR ANY CHAR)
  506. ;WILL BE ECHOED BACK AND FORTH AD INFINITUM.
  507. ;
  508. TRMECHO PROC    NEAR
  509.         PUSH    DX
  510.     MOV    DX,MODCTLP
  511.     IN    AL,DX            ;GET STATUS
  512.     POP    DX
  513.     AND    AL,MODRCVB    ;ISOLATE READY BIT
  514.     CMP    AL,MODRCVR    ;ARE WE READY?
  515.     JNZ    L00011
  516.     JMP    LINECHR     ;YES, READ THE CHR
  517. L00011:    CALL    STAT        ;CHECK LOCAL KB
  518.     JNZ    L00012
  519.     JMP    TRMECHO     ;..NO CHAR
  520. L00012:    CALL    KEYIN       ;GET LOCAL CHAR
  521.     CMP    AL,EXITCHR    ;END?
  522.     JNZ    L00013
  523.     JMP    CKDIS       ;YES, CK DISCONN, EXIT
  524. L00013:    CMP    AL,DISCCHR    ;DISCONN?
  525.     JNZ    L00014
  526.     JMP    DISCONN     ;..YES, DO IT.
  527. L00014: PUSH    DX
  528.     MOV    DX,MODDATP
  529.     OUT    DX,AL       ;SEND CHAR
  530.     POP    DX
  531.     CALL    TYPEZZ      ;ECHO IT LOCALLY
  532.     JMP    TRMECHO     ;..AND LOOP
  533. ;
  534. ;GOT CHAR FROM LINE
  535. ;
  536. LINECHR:
  537.         PUSH    DX
  538.     MOV    DX,MODDATP
  539.     IN    AL,DX       ;GET CHAR
  540.     OUT    DX,AL       ;ECHO IT
  541.     POP    DX
  542.     CALL    TYPEZZ      ;TYPEZZ IT
  543.     JMP    TRMECHO     ;LOOP
  544. TRMECHO    ENDP
  545. ;
  546. ; * * * * * * * * * * * * * * * * * * * *
  547. ;                    *
  548. ;    SENDFIL: SENDS A CP/M FILE    *
  549. ;                    *
  550. ; * * * * * * * * * * * * * * * * * * * *
  551. ;
  552. ;THE CP/M FILE SPECIFIED IN THE MODEM COMMAND
  553. ;IS TRANSFERRED OVER THE PHONE TO ANOTHER
  554. ;COMPUTER RUNNING MODEM WITH THE "R" (RECEIVE)
  555. ;OPTION.  THE DATA IS SENT ONE SECTOR AT A
  556. ;TIME WITH HEADERS AND CHECKSUMS, AND RE-
  557. ;TRANSMISSION ON ERRORS.  
  558. ;
  559. SENDFIL PROC     NEAR
  560.         CALL    OPENFIL     ;OPEN THE FILE
  561.     MOV    DL,80       ;WAIT 80 SEC..
  562.     CALL    WAITNAK     ;..FOR INITIAL NAK
  563. SENDLP:    CALL    RDSECT      ;READ A SECTOR
  564.     JAE    L00016
  565.     JMP    SENDEOF     ;SEND EOF IF DONE
  566. L00016:    CALL    INCRSNO     ;BUMP SECTOR #
  567.     XOR    AL,AL       ;ZERO ERROR..
  568.     MOV     ERRCT,AL    ;..COUNT
  569. SENDRPT:
  570.         CALL    SENDHDR            ;SEND A HEADER
  571.     CALL    SENDSEC     ;SEND DATA SECTOR
  572.     CALL    SENDCKS     ;SEND CKSUM
  573.     CALL    GETACK      ;GET THE ACK
  574.     JAE    L00017
  575.     JMP    SENDRPT     ;REPEAT IF NO ACK
  576. L00017:    JMP    SENDLP      ;LOOP UNTIL EOF
  577. ;
  578. ;FILE SENT, SEND EOT'S
  579. ;
  580. SENDEOF:
  581.     MOV    AL,EOT      ;SEND..
  582.     CALL    SEND        ;..AN EOT
  583.     CALL    GETACK      ;GET THE ACK
  584.     JAE    L00018
  585.     JMP    SENDEOF     ;LOOP IF NO ACK
  586. L00018:    JMP    DONE        ;ALL DONE
  587. SENDFIL    ENDP
  588. ;
  589. ; * * * * * * * * * * * * * * * * * * * *
  590. ;                    *
  591. ;    RCVFIL: RECEIVE A FILE        *
  592. ;                    *
  593. ; * * * * * * * * * * * * * * * * * * * *
  594. ;
  595. ;RECEIVES A FILE IN BLOCK FORMAT AS SENT
  596. ;BY ANOTHER PERSON DOING "MODEM S FN.FT".
  597. ;
  598. RCVFIL    PROC    NEAR
  599.            CALL    ERASFIL     ;ERASE THE FILE
  600.     CALL    MAKEFIL     ;..THEN MAKE NEW
  601.     MOV    AL,QFLG     ;SEE IF IN QUIET MODE
  602.     OR    AL,AL
  603.     JZ    L00019
  604.     JMP    RCVLP       ;NOT IN QUIET MODE, SKIP MSG
  605. L00019:    PUSH    BX
  606.     MOV    BX,OFFSET MSG01A
  607.     CALL    ILPRT       ;PRINT:
  608.     POP    BX
  609. RCVLP:    CALL    RCVSECT            ;GET A SECTOR
  610.     JAE    L00020
  611.     JMP    RCVEOT      ;GOT EOT
  612. L00020:    CALL    WRSECT      ;WRITE THE SECTOR
  613.     CALL    INCRSNO     ;BUMP SECTOR #
  614.     CALL    SENDACK     ;ACK THE SECTOR
  615.     JMP    RCVLP       ;LOOP UNTIL EOF
  616. ;
  617. ;GOT EOT ON SECTOR - FLUSH BUFFERS, END
  618. ;
  619. RCVEOT:    CALL    WRBLOCK     ;WRITE THE LAST BLOCK
  620.     CALL    SENDACK     ;ACK THE SECTOR
  621.     CALL    CLOSFIL     ;CLOSE THE FILE
  622.     MOV    AL,QFLG     ;QUIET..
  623.     OR    AL,AL       ;..MODE?
  624.     JNZ    L00021
  625.     JMP    CKDIS       ;YES, CK DISCONN, END.
  626. L00021:    JMP    DONE        ;DISCONN IF REQ'D
  627. RCVFIL    ENDP
  628. ;
  629. ; * * * * * * * * * * * * * * * * * * * *
  630. ;                    *
  631. ;        SUBROUTINES        *
  632. ;                    *
  633. ; * * * * * * * * * * * * * * * * * * * *
  634. ;
  635. ;
  636. ;---->    RCVSECT: RECEIVE A SECTOR
  637. ;
  638. ;RETURNS WITH CARRY SET IF EOT RECEIVED.
  639. ;
  640. RCVSECT PROC    NEAR
  641.     XOR    AL,AL       ;GET 0
  642.     MOV        ERRCT,AL    ;INIT ERROR COUNT
  643. RCVRPT:    MOV    AL,QFLG     ;QUIET?
  644.     OR    AL,AL
  645.     JNZ    L00022
  646.     JMP    RCVSQ       ;YES, NO STAT MSG.
  647. L00022:    PUSH    BX
  648.     MOV    BX,OFFSET MSG02
  649.     CALL    ILPRT       ;PRINT:
  650.     POP    BX
  651.     MOV    AL,SECTNO    ;GET SECTOR #
  652.     INC    AL          ;(REAL INR LATER)
  653.     CALL    HEXO        ;PRINT IN HEX
  654.     CALL    CRLF        ;..THEN CRLF
  655. ;
  656. RCVSQ:    MOV    CH,10       ;10 SEC TIMEOUT
  657.     CALL    RECV        ;GET SOH/EOT
  658.     JAE    L00023
  659.     JMP    RCVSTOT     ;TIMEOUT
  660. L00023:    CMP    AL,SOH      ;GET SOH?
  661.     JNZ    L00024
  662.     JMP    RCVSOH      ;..YES
  663. ;
  664. ;EARLIER VERS. OF MODEM PROG SENT SOME NULLS -
  665. ;IGNORE THEM
  666. ;
  667. L00024:    OR    AL,AL       ;00 FROM SPEED CHECK?
  668.     JNZ    L00025
  669.     JMP    RCVSQ       ;YES, IGNORE IT
  670. L00025:    CMP    AL,EOT      ;END OF TRANSFER?
  671.     STC                 ;RETURN WITH CARRY..
  672.     JNZ    L00026
  673.     RET                 ;..SET IF EOT
  674. ;
  675. ;DIDN'T GET SOH  OR EOT - 
  676. ;
  677. L00026:    MOV    CH,AL       ;SAVE CHAR
  678.     MOV    AL,VSEEFLG    ;VIEWING..
  679.     OR    AL,AL       ;..MODE?
  680.     JNZ    L00027
  681.     JMP    RCVSEH      ;YES, PRT.MSG
  682. L00027:    MOV    AL,QFLG     ;QUIET..
  683.     OR    AL,AL       ;..MODE?
  684.     JNZ    RCVSEH 
  685.     JMP    RCVSERR     ;YES, SKIP MSG
  686. RCVSEH:    MOV    AL,CH       ;GET CHAR
  687.     CALL    HEXO        ;SHOW IN HEX
  688.     PUSH    BX
  689.     MOV    BX,OFFSET MSG03
  690.     CALL    ILPRT       ;PRINT:
  691.     POP    BX
  692. ;
  693. ;DIDN'T GET VALID HEADER - PURGE THE LINE,
  694. ;THEN SEND NAK.
  695. ;
  696. RCVSERR:
  697.     MOV    CH,1        ;WAIT FOR 1 SEC..
  698.     CALL    RECV        ;..WITH NO CHARS
  699.     JNAE    L00029
  700.     JMP    RCVSERR     ;LOOP UNTIL SENDER DONE
  701. L00029:    MOV    AL,NAK      ;SEND..
  702.     CALL    SEND        ;..THE NAK
  703.     MOV    AL,ERRCT    ;ABORT IF..
  704.     INC    AL          ;..WE HAVE REACHED..
  705.     MOV        ERRCT,AL    ;..THE ERROR..
  706.     CMP    AL,ERRLIM    ;..LIMIT?
  707.     JAE    L00030
  708.     JMP    RCVRPT      ;..NO, TRY AGAIN
  709. ;
  710. ;10 ERRORS IN A ROW - 
  711. ;
  712. L00030:    MOV    AL,VSEEFLG    ;VIEWING..
  713.     OR    AL,AL       ;..FILE?
  714.     JNZ    L00031
  715.     JMP    RCVCKQ      ;YES, ASK RETRY/QUIT
  716. L00031:    MOV    AL,QFLG     ;QUIET..
  717.     OR    AL,AL       ;..MODE?
  718.     JNZ    RCVCKQ 
  719.     JMP    RCVSABT     ;ABORT
  720. RCVCKQ:    CALL    CKQUIT      ;RETRY/QUIT?
  721.     JNZ    RCVSABT
  722.     JMP    RCVSECT     ;TRY AGAIN
  723. ;
  724. RCVSABT:
  725.     CALL    CLOSFIL     ;KEEP WHATEVER WE GOT
  726.     MOV    DX,OFFSET MSG20
  727.     CALL    ERXIT
  728. ;
  729. ;TIMEDOUT ON RECEIVE
  730. ;
  731. RCVSTOT:
  732.         STI
  733.     MOV    AL,VSEEFLG    ;VIEWING..
  734.     OR    AL,AL       ;..MODE?
  735.     JNZ    L00034
  736.     JMP    RCVSPT      ;YES, PRT MSG
  737. L00034:    MOV    AL,QFLG     ;QUIET..
  738.     OR    AL,AL       ;..MODE?
  739.     JNZ    RCVSPT 
  740.     JMP    RCVSERR     ;YES, NO MSG
  741. RCVSPT:    PUSH    BX
  742.     MOV    BX,OFFSET MSG03
  743.     CALL    ILPRT
  744.     POP    BX
  745. RCVPRN:    MOV    AL,ERRCT    ;PRINT ERROR..
  746.     CALL    HEXO        ;..COUNT
  747.     CALL    CRLF
  748.     JMP    RCVSERR     ;BUMP ERR CT, ETC.
  749. ;
  750. ;GOT SOH - GET BLOCK #, BLOCK # COMPLEMENTED
  751. ;
  752. RCVSOH:    MOV    CH,1        ;TIMEOUT = 1 SEC
  753.     CALL    RECV        ;GET SECTOR
  754.     JAE    L00036
  755.     JMP    RCVSTOT     ;GOT TIMEOUT
  756. L00036:    MOV    DH,AL       ;D=BLK #
  757.     MOV    CH,1        ;TIMEOUT = 1 SEC
  758.     CALL    RECV        ;GET CMA'D SECT #
  759.     JAE    L00037
  760.     JMP    RCVSTOT     ;TIMEOUT
  761. L00037:    NOT    AL          ;CALC COMPLEMENT
  762.     CMP    AL,DH       ;GOOD SECTOR #?
  763.     JNZ    L00038
  764.     JMP    RCVDATA     ;YES, GET DATA
  765. ;
  766. ;GOT BAD SECTOR #
  767. ;
  768. L00038:    MOV    AL,VSEEFLG    ;VIEWING..
  769.     OR    AL,AL       ;..MODE?
  770.     JNZ    L00039
  771.     JMP    RCVBSE      ;..YES, PRT MSG
  772. L00039:    MOV    AL,QFLG     ;QUIET..
  773.     OR    AL,AL       ;..MODE?
  774.     JNZ    RCVBSE 
  775.     JMP    RCVSERR     ;..YES, NO MSG
  776. ;
  777. RCVBSE:    PUSH    BX
  778.     MOV    BX,OFFSET MSG04
  779.     CALL    ILPRT       ;PRINT:
  780.     POP    BX
  781.     JMP    RCVSERR     ;BUMP ERROR CT.
  782. ;
  783. ;
  784. RCVDATA:
  785.     MOV    AL,DH       ;GET SECTOR #
  786.     MOV       RCVSNO,AL    ;SAVE IT
  787.     MOV    AL,1        ;SHOW..
  788.     MOV       DATAFLG,AL    ;GETTING DATA
  789.     MOV    CL,0        ;INIT CKSUM
  790.     MOV    BX,80H      ;POINT TO BUFFER
  791.     CLI
  792. RCVCHR:    MOV    CH,1        ;1 SEC TIMEOUT
  793.     CALL    RECV        ;GET CHAR
  794.     JAE    L00041
  795.     JMP    RCVSTOT     ;TIMEOUT
  796. L00041:    MOV    BYTE PTR [BX],AL ;STORE CHAR
  797.     INC    BL          ;DONE?
  798.     JZ    L00042
  799.     JMP    RCVCHR      ;NO, LOOP
  800. ;
  801. ;VERIFY CHECKSUM
  802. ;
  803. L00042:    MOV    DH,CL       ;SAVE CHECKSUM
  804.     XOR    AL,AL       ;SHOW..
  805.     MOV        DATAFLG,AL    ;..END OF DATA
  806.     MOV    CH,1        ;TIMEOUT LEN.
  807.     CALL    RECV        ;GET CHECKSUM
  808.     JAE    L00043
  809.     JMP    RCVSTOT     ;TIMEOUT
  810. L00043:    STI
  811.     CMP    AL,DH       ;CHECKSUM OK?
  812.     JZ    L00044
  813.     JMP    RCVCERR     ;NO, ERROR
  814. ;
  815. ;GOT A SECTOR, IT'S A DUP IF = PREV,
  816. ;    OR OK IF = 1 + PREV SECTOR
  817. ;
  818. L00044:    MOV    AL,RCVSNO    ;GET RECEIVED
  819.     MOV    CH,AL       ;SAVE IT
  820.     MOV    AL,SECTNO    ;GET PREV
  821.     CMP    AL,CH       ;PREV REPEATED?
  822.     JNZ    L00045
  823.     JMP    RECVACK     ;ACK TO CATCH UP
  824. L00045:    INC    AL          ;CALC NEXT SECTOR #
  825.     CMP    AL,CH       ;MATCH?
  826.     JZ    L00046
  827.     JMP    ABORT       ;NO MATCH - STOP SENDER, EXIT
  828. L00046:    RET                 ;CARRY OFF - NO ERRORS
  829. ;
  830. ;GOT CKSUM
  831. ;
  832. RCVCERR:
  833.     MOV    AL,VSEEFLG    ;VIEWING..
  834.     OR    AL,AL       ;..MODE?
  835.     JNZ    L00047
  836.     JMP    RCVCPR      ;..YES, PRT MSG
  837. L00047:    MOV    AL,QFLG     ;QUIET..
  838.     OR    AL,AL       ;..MODE?
  839.     JNZ    RCVCPR 
  840.     JMP    RCVSERR     ;YES, NO MSG
  841. RCVCPR:    PUSH    BX
  842.     MOV    BX,OFFSET MSG05
  843.     CALL    ILPRT
  844.     POP    BX
  845.     JMP    RCVPRN      ;PRINT ERROR #
  846. ;
  847. ;PREV SECT REPEATED, DUE TO THE LAST ACK
  848. ;BEING GARBAGED.  ACK IT SO SENDER WILL CATCH UP 
  849. ;
  850. RECVACK:
  851.     CALL    SENDACK     ;SEND THE ACK,
  852.     JMP    RCVSECT     ;GET NEXT BLOCK
  853. ;
  854. ;SEND AN ACK FOR THE SECTOR
  855. ;
  856. SENDACK:
  857.     MOV    AL,ACK      ;GET ACK
  858.     CALL    SEND        ;..AND SEND IT
  859.     RET
  860. RCVSECT ENDP
  861. ;
  862. ;---->    SENDHDR: SEND THE SECTOR HEADER
  863. ;
  864. ;SEND: (SOH) (BLOCK #) (COMPLEMENTED BLOCK #)
  865. ;
  866. SENDHDR PROC    NEAR
  867.     MOV    AL,QFLG     ;QUIET..
  868.     OR    AL,AL       ;..MODE?
  869.     JNZ    L00049
  870.     JMP    SENDHNM     ;YES, SKIP STATUS MSG.
  871. L00049:    PUSH    BX
  872.     MOV    BX,OFFSET MSG06
  873.     CALL    ILPRT       ;PRINT:
  874.     POP    BX
  875.     MOV    AL,SECTNO    ;PRINT..
  876.     CALL    HEXO        ;..SECT #
  877.     CALL    CRLF        ;..THEN CR/LF
  878. ;
  879. SENDHNM:
  880.         MOV    AL,SOH      ;SEND..
  881.     CALL    SEND        ;..SOH,
  882.     MOV    AL,SECTNO    ;THEN SEND..
  883.     CALL    SEND        ;..SECTOR #
  884.     MOV    AL,SECTNO    ;THEN SENDOR #
  885.     NOT    AL          ;..COMPLEMENTED..
  886.     CALL    SEND        ;..SECTOR #
  887.     RET                 ;FROM SENDHDR
  888. SENDHDR ENDP
  889. ;
  890. ;---->    SENDSEC: SEND THE DATA SECTOR
  891. ;
  892. ;WHILE SENDING THE SECTOR, THE "DATAFLG" IS SET
  893. ;SUCH THAT IF "V" (VIEW THE FILE) WAS REQUESTED,
  894. ;THE "SHOW" ROUTINE WILL PRINT THE DATA, BUT NOT
  895. ;THE HDR OR CKSUM, OR ANY NON-FATAL MSGS.
  896. ;
  897. SENDSEC PROC    NEAR
  898.     MOV    AL,1        ;SHOW NOW AT DATA..
  899.     MOV        DATAFLG,AL    ;..FOR VIEW COMMAND
  900.     MOV    CL,0        ;INIT CKSUM
  901.     MOV    BX,80H      ;POINT TO BUFFER
  902. SENDC:    MOV    AL,BYTE PTR [BX] ;GET A CHAR
  903.     CALL    SEND        ;SEND IT
  904.     INC    BL          ;POINT TO NEXT CHAR
  905.     JZ    L00050
  906.     JMP    SENDC       ;LOOP IF <100H
  907. L00050:    XOR    AL,AL       ;SHOW NOT INTO DATA..
  908.     MOV       DATAFLG,AL    ;..FOR VIEW COMMAND
  909.     RET                 ;FROM SENDSEC
  910. SENDSEC ENDP
  911. ;
  912. ;---->    SENDCKS: SEND THE CHECKSUM
  913. ;
  914. SENDCKS PROC    NEAR
  915.     MOV    AL,CL       ;SEND THE..
  916.     CALL    SEND        ;..CHECKSUM
  917.     RET                 ;FROM SENDCKS
  918. SENDCKS    ENDP
  919. ;
  920. ;---->    GETACK: GET THE ACK ON THE SECTOR
  921. ;
  922. ;RETURNS WITH CARRY CLEAR IF ACK RECEIVED.
  923. ;IF AN ACK IS NOT RECEIVED, THE ERROR COUNT
  924. ;IS INCREMENTED, AND IF LESS THAN "ERRLIM",
  925. ;CARRY IS SET AND CONTROL RETURNS.  IF THE
  926. ;ERROR COUNT IS AT "ERRLIM", THE PROGRAM
  927. ;ABORTS IF IN "QUIET" MODE, OR ASKS THE
  928. ;USER FOR QUIT/RETRY IF NOT.
  929. ;
  930. GETACK  PROC    NEAR
  931.            MOV    CH,10       ;WAIT 10 SECONDS MAX
  932.     CALL    RECVDG      ;RECV W/GARBAGE COLLECT
  933.     JAE    L00051
  934.     JMP    GESATOT     ;TIMED OUT
  935. L00051:    CMP    AL,ACK      ;OK? (CARRY OFF IF =)
  936.     JNZ    L00052
  937.     RET                 ;YES, RET FROM GETACK
  938. ;
  939. L00052  LABEL   NEAR
  940.         IF      CANFLG
  941.     CMP    AL,CAN      ;CANCEL TRANSMISSION?
  942.     JNZ    L00053
  943.     JMP    ABORT       ;..YES
  944. L00053  LABEL    NEAR
  945.     ENDIF
  946. ;
  947.     MOV    CH,AL       ;SAVE CHAR
  948.     MOV    AL,QFLG     ;QUIET..
  949.     OR    AL,AL       ;..MODE?
  950.     JNZ    L00054
  951.     JMP    ACKERR      ;..YES, NO MSG
  952. L00054:    MOV    AL,CH       ;GET CHAR
  953.     CALL    HEXO        ;PRINT IN HEX
  954.     PUSH    BX
  955.     MOV    BX,OFFSET MSG07
  956.     CALL    ILPRT       ;PRINT:
  957.     POP    BX
  958. ;
  959. ;TIMEOUT OR ERROR ON ACK - BUMP ERROR COUNT
  960. ;
  961. ACKERR:    MOV    AL,ERRCT    ;GET COUNT
  962.     INC    AL          ;BUMP IT
  963.     MOV        ERRCT,AL    ;SAVE BACK
  964.     CMP    AL,ERRLIM    ;AT LIMIT?
  965.     JNB    L00055
  966.     RET                 ;NOT AT LIMIT
  967. ;
  968. ;REACHED ERROR LIMIT
  969. ;
  970. L00055:    MOV    AL,VSEEFLG    ;VIEWING..
  971.     OR    AL,AL       ;..FILE?
  972.     JNZ    L00056
  973.     JMP    GACKV       ;YES, ASK QUIT/RETRY
  974. L00056:    MOV    AL,QFLG     ;QUIET..
  975.     OR    AL,AL       ;..MODE?
  976.     JNZ    GACKV
  977.     JMP    CSABORT     ;..YES, NO MCG
  978. GACKV:    CALL    CKQUIT      ;SEE IF WANT TO QUIT
  979.     STC                 ;TO SHOW NO ACK
  980.     JNZ    CSABORT
  981.     RET                 ;KEEP ON TRYIN'
  982. CSABORT:
  983.     MOV    DX,OFFSET MSG21
  984.     CALL    ERXIT
  985. GETACK    ENDP
  986. ;
  987. ;TIMEOUT GETTING ACK
  988. ;
  989. GESATOT PROC    NEAR
  990.     MOV    AL,QFLG     ;QUIET..
  991.     OR    AL,AL       ;..MODE?
  992.     JNZ    L00059
  993.     JMP    ACKERR      ;YES, NO MSG
  994. L00059:    PUSH    BX
  995.     MOV    BX,OFFSET MSG08
  996.     CALL    ILPRT       ;PRINT:
  997.      POP    BX
  998.     JMP    ACKERR
  999. GESATOT    ENDP
  1000. ;---->    CKABORT: CHECK FOR LOCAL ABORT
  1001. ;
  1002. ;IF THE USER WANTS TO CANCEL THE TRANSMISSION,
  1003. ;TYPING CTL-X WILL ABORT IT.  NOTE THIS TEST
  1004. ;IS NOT MADE IF IN QUIET (NO CONSOLE I/O) MODE.
  1005. ;
  1006. CKABORT PROC    NEAR
  1007.     MOV    AL,VSEEFLG    ;VIEWING?
  1008.     OR    AL,AL
  1009.     JNZ    L00060
  1010.     JMP    CKABGO      ;YES, CHECK
  1011. L00060: MOV    AL,QFLG        ;SUPPRESSED..
  1012.     OR    AL,AL       ;..CONSOLE I/O?
  1013.     JNZ    L00061
  1014.     RET                 ;YES, NO TEST
  1015. ;
  1016. L00061  LABEL    NEAR
  1017.     IF NOT CANFLG
  1018.     RET
  1019.     ENDIF
  1020. ;
  1021. CKABGO:    CALL    STAT        ;KEY PRESSED?
  1022.     JNZ    L00062
  1023.     RET                 ;NOTHING FROM KEYBOARD
  1024. L00062:    CALL    KEYIN       ;GET DATA
  1025.     CMP    AL,EXITCHR    ;TIME TO END?
  1026.     JZ    ABORT  
  1027.     RET                 ;NO, CONTINUE
  1028. ABORT:    NOP            ;LEA    SP,STACK
  1029. ABORTL:    MOV    CH,1        ;1 SEC. W/O CHARS.
  1030.     CALL    RECV
  1031.     JNAE    L00064
  1032.     JMP    ABORTL      ;LOOP UNTIL SENDER DONE
  1033. L00064:    MOV    AL,CAN      ;CONTROL X
  1034.     CALL    SEND        ;STOP SENDING END
  1035. ABORTW:    MOV    CH,1        ;1 SEC W/O CHARS.
  1036.     CALL    RECV
  1037.     JNAE    L00065
  1038.     JMP    ABORTW      ;LOOP UNTIL SENDER DONE
  1039. L00065:    MOV    AL,' '      ;GET A SPACE...
  1040.     CALL    SEND        ;TO CLEAR OUT CONTROL X
  1041.     PUSH    BX
  1042.     MOV    BX,OFFSET MSG09
  1043.     CALL    ILPRT       ;EXIT WITH ABORT MSG
  1044.     POP    BX
  1045.     JMP    CKDIS       ;CHECK FOR DISCONN.
  1046. CKABORT ENDP
  1047. ;
  1048. ;---->    INCRSNO: INCREMENT SECTOR #
  1049. ;
  1050. INCRSNO PROC    NEAR
  1051.     MOV    AL,SECTNO    ;INCR..
  1052.     INC    AL          ;..SECT..
  1053.     MOV        SECTNO,AL    ;..NUMBER
  1054.     RET
  1055. INCRSNO ENDP
  1056. ;
  1057. ;---->    ERASFIL: ERASE THE INCOMING FILE.
  1058. ;
  1059. ;IF IT EXISTS, ASK IF IT MAY BE ERASED.
  1060. ;
  1061. ERASFIL PROC     NEAR
  1062.     MOV    DX,OFFSET FCB      ;POINT TO CTL BLOCK
  1063.     MOV    CL,SRCHF    ;SEE IF IT..
  1064.     CALL    BDOS        ;..EXISTS
  1065.     INC    AL          ;FOUND?
  1066.     JNZ    L00066
  1067.     RET                 ;..NO, RETURN
  1068. L00066:    PUSH    BX
  1069.     MOV    BX,OFFSET MSG10
  1070.     CALL    ILPRT       ;PRINT:
  1071.     POP    BX
  1072.     CALL    KEYIN       ;GET CHAR
  1073.     LAHF
  1074.     XCHG    AL,AH
  1075.     PUSH    AX
  1076.     XCHG    AL,AH
  1077.     CALL    TYPEZZ      ;ECHO
  1078.     POP    AX
  1079.     XCHG    AL,AH
  1080.     SAHF    
  1081.     AND    AL,5FH      ;MAKE UPPER CASE
  1082.     CMP    AL,'Y'      ;WANT ERASED?
  1083.     JZ    L00067
  1084.     JMP    CKDIS       ;QUIT IF NOT ERASE
  1085. L00067:    CALL    CRLF        ;BACK TO START OF LINE
  1086. ;
  1087. ;ERASE OLD FILE
  1088. ;
  1089.     MOV    DX,OFFSET FCB      ;POINT TO FCB
  1090.     MOV    CL,ERASE    ;GET BDOS FNC
  1091.     CALL    BDOS        ;DO THE ERASE
  1092.     RET                 ;FROM "ERASFIL"
  1093. ERASFIL    ENDP
  1094. ;
  1095. ;---->    MAKEFIL: MAKES THE FILE TO BE RECEIVED
  1096. ;
  1097. MAKEFIL PROC    NEAR
  1098.     MOV    DX,OFFSET FCB      ;POINT TO FCB
  1099.     MOV    CL,MAKE     ;GET BDOS FNC
  1100.     CALL    BDOS        ;TO THE MAKE
  1101.     INC    AL          ;FF=BAD?
  1102.     JZ    L00068
  1103.     RET                 ;OPEN OK
  1104. ;DIRECTORY FULL - CAN'T MAKE FILE
  1105. L00068:    MOV    DX,OFFSET MSG22
  1106.     CALL    ERXIT
  1107. MAKEFIL    ENDP
  1108. ;
  1109. ;---->    OPENFIL: OPENS THE FILE TO BE SENT
  1110. ;
  1111. OPENFIL PROC    NEAR
  1112.     MOV    DX,OFFSET FCB      ;POINT TO FILE
  1113.     MOV    CL,OPEN     ;GET FUNCTION
  1114.     CALL    BDOS        ;OPEN IT
  1115.     INC    AL          ;OPEN OK?
  1116.     JZ    L00069
  1117.     JMP    OPENOK      ;..YES
  1118. L00069:    PUSH    DX
  1119.     MOV    DX,OFFSET MSG11
  1120.     CALL    ERXIT       ;..NO, ABORT
  1121.     POP    DX
  1122. ;
  1123. OPENOK:
  1124.     PUSH    BX
  1125.     MOV    BX,OFFSET MSG12
  1126.     CALL    ILPRT       ;PRINT:
  1127.     POP    BX
  1128.     MOV    AL,FCBSZH    ;GET FILE SIZE HIGH ORDER
  1129.     CALL    HEXO        ;PRINT IN HEX
  1130.     MOV    AL,FCBSZL    ;GET FILE SIZE LOW ORDER
  1131.     CALL    HEXO        ;PRINT IN HEX
  1132.     MOV    AL,'H'
  1133.     CALL    TYPEZZ      ;PRINT 'H' AFTER NUMBER
  1134.     CALL    CRLF        ;..THEN CRLF
  1135.     RET
  1136. OPENFIL ENDP
  1137. ;
  1138. ;---->    CLOSFIL: CLOSES THE RECEIVED FILE
  1139. ;
  1140. CLOSFIL PROC    NEAR
  1141.     MOV    DX,OFFSET FCB      ;POINT TO FILE
  1142.     MOV    CL,CLOSE    ;GET FUNCTION
  1143.     CALL    BDOS        ;CLOSE IT
  1144.     INC    AL          ;CLOSE OK?
  1145.     JZ    L00070
  1146.     RET                 ;..YES, RETURN
  1147. L00070:    MOV    DX,OFFSET MSG22A
  1148.     CALL    ERXIT       ;..NO, ABORT
  1149. CLOSFIL ENDP
  1150. ;
  1151. ;---->    RDSECT: READS A SECTOR
  1152. ;
  1153. ;FOR SPEED, THIS ROUTINE BUFFERS UP 16
  1154. ;SECTORS AT A TIME.
  1155. ;
  1156. RDSECT  PROC    NEAR
  1157.            MOV    AL,SECINBF    ;GET # SECT IN BUFF.
  1158.     DEC    AL          ;DECREMENT..
  1159.     MOV        SECINBF,AL    ;..IT
  1160.     JNS    L00071
  1161.     JMP    RDBLOCK     ;EXHAUSTED?  NEED MORE.
  1162. L00071:    MOV    BX,SECPTR    ;GET POINTER
  1163.     MOV    DX,80H      ;TO DATA 
  1164.     CALL    MOVE128     ;MOVE TO BUFFER
  1165.     MOV    SECPTR,BX    ;SAVE BUFFER POINTER
  1166.     RET                 ;FROM "READSEC"
  1167. ;
  1168. ;BUFFER IS EMPTY - READ IN ANOTHER BLOCK OF 16
  1169. ;
  1170. RDBLOCK LABEL    NEAR
  1171.     MOV    AL,EOFLG    ;GET EOF FLAG
  1172.     CMP    AL,1        ;IS IT SET/
  1173.     STC                 ;TO SHOW EOF
  1174.     JNZ    L00072
  1175.     RET                 ;GOT EOF
  1176. L00072:    MOV    CL,0        ;SECTORS IN BLOCK
  1177.     LEA    DX,DBUF     ;TO DISK BUFFER
  1178. RDSECLP LABEL    NEAR
  1179.     PUSH    CX
  1180.     PUSH    DX
  1181.     MOV    CL,STDMA    ;SET DMA..
  1182.     CALL    BDOS        ;..ADDR
  1183.     MOV    DX,OFFSET FCB
  1184.     MOV    CL,READ
  1185.     CALL    BDOS
  1186.     POP    DX
  1187.     POP    CX
  1188.     OR    AL,AL       ;READ OK?
  1189.     JNZ    L00073
  1190.     JMP    RDSECOK     ;YES
  1191. L00073:    DEC    AL          ;EOF?
  1192.     JZ    REOF        ; 1 = EOF (regular)
  1193.     DEC    AL
  1194.     JZ    L00074        ; 2 = ERROR (trans area too small)
  1195.     DEC    AL
  1196.     JZ    REOF        ; 3 = EOF (partial block)
  1197.     JMP    L00074        ; ALL OTHER RETURNS CONSIDERED ERROR !!!
  1198. ;
  1199. ;READ ERROR
  1200. ;
  1201. L00074:    MOV    DX,OFFSET MSG23
  1202.     CALL    ERXIT
  1203. ;
  1204. RDSECOK:
  1205.     MOV    BX,80H
  1206.     PUSH    SI
  1207.     PUSHF
  1208.     ADD    BX,DX
  1209.     RCR    SI,1
  1210.     POPF
  1211.     RCL    SI,1
  1212.     POP    SI          ;TO NEXT BUFF
  1213.     XCHG    BX,DX       ;BUFF TO DE
  1214.     INC    CL          ;MORE SECTORS?
  1215.     MOV    AL,CL       ;GET COUNT
  1216.     CMP    AL,16       ;DONE?
  1217.     JNZ    L00075
  1218.     JMP    RDBFULL     ;..YES, BUFF IS FULL
  1219. L00075:    JMP    RDSECLP     ;READ MORE
  1220. ;
  1221. REOF:    MOV    AL,1
  1222.     MOV        EOFLG,AL    ;SET EOF FLAG
  1223.     MOV    AL,CL
  1224. ;
  1225. ;BUFFER IS FULL, OR GOT EOF
  1226. ;
  1227. RDBFULL:
  1228.     MOV    SECINBF,AL    ;STORE SECTOR COUNT
  1229.     MOV    BX,OFFSET DBUF    ;INIT BUFFER..
  1230.     MOV    SECPTR,BX    ;..POINTER
  1231.     MOV    DX,80H      ;RESET..
  1232.     MOV    CL,STDMA    ;..DMA..
  1233.     CALL    BDOS        ;..ADDR
  1234.     JMP    RDSECT      ;PASS SECT TO CALLER
  1235. RDSECT    ENDP
  1236. ;
  1237. ;---->    WRSECT: WRITE A SECTOR
  1238. ;
  1239. ;WRITES THE SECTOR INTO A BUFFER.  WHEN 16
  1240. ;HAVE BEEN WRITTEN, WRITES THE BLOCK TO DISK.
  1241. ;
  1242. ;ENTRY POINT "WRBLOCK" FLUSHES THE BUFFER AT EOF.
  1243. ;
  1244. WRSECT  PROC    NEAR
  1245.            MOV    BX,SECPTR    ;GET BUFF ADDR
  1246.     XCHG    BX,DX       ;TO DE FOR MOVE
  1247.     MOV    BX,80H      ;FROM HERE
  1248.     CALL    MOVE128     ;MOVE TO BUFFER
  1249.     XCHG    BX,DX       ;SAVE NEXT..
  1250.     MOV    SECPTR,BX    ;..BLOCK POINTER
  1251.     MOV    AL,SECINBF    ;BUMP THE..
  1252.     INC    AL          ;..SECTOR #..
  1253.     MOV        SECINBF,AL    ;..IN THE BUFF
  1254.     CMP    AL,16       ;HAVE WE 16?
  1255.     JZ    WRBLOCK
  1256.     RET                 ;NO, RETURN
  1257. ;
  1258. ;---->    WRBLOCK: WRITES A BLOCK TO DISK
  1259. ;
  1260. WRBLOCK:
  1261.      MOV    AL,SECINBF    ;# SECT IN BUFFER
  1262.     OR    AL,AL       ;0 MEANS END OF FILE
  1263.     JNZ    L00077
  1264.     RET                 ;NONE TO WRITE
  1265. L00077:    MOV    CL,AL       ;SAVE COUNT
  1266.     LEA    DX,DBUF     ;POINT TO DISK BUFF
  1267. DKWRLP:    PUSH    BX
  1268.     PUSH    DX
  1269.     PUSH    CX
  1270.     MOV    CL,STDMA    ;SET DMA
  1271.     CALL    BDOS        ;TO BUFFER
  1272.     MOV    DX,OFFSET FCB      ;THEN WRITE
  1273.     MOV    CL,WRITE    ;..THE..
  1274.     CALL    BDOS        ;..BLOCK
  1275.     POP    CX
  1276.     POP    DX
  1277.     POP    BX
  1278.     OR    AL,AL
  1279.     JZ    L00078
  1280.     JMP    WRERR       ;OOPS, ERROR
  1281. L00078:    MOV    BX,80H      ;LENGTH OF 1 SECT
  1282.     PUSH    SI
  1283.     PUSHF
  1284.     ADD    BX,DX
  1285.     RCR    SI,1
  1286.     POPF
  1287.     RCL    SI,1
  1288.     POP    SI          ;HL= NEXT BUFF
  1289.     XCHG    BX,DX       ;TO DE FOR SETDMA
  1290.     DEC    CL          ;MORE SECTORS?
  1291.       JZ    L00079
  1292.     JMP    DKWRLP      ;..YES, LOOP
  1293. L00079:    XOR    AL,AL       ;GET A ZERO
  1294.     MOV       SECINBF,AL    ;RESET # OF SECTORS
  1295.     MOV    BX,OFFSET DBUF    ;RESET BUFFER..
  1296.     MOV    SECPTR,BX    ;..POINTER
  1297. ;
  1298.     MOV    DX,80H      ;07/13/79 MOD..
  1299.     MOV    CL,STDMA    ;..TO RESET..
  1300.     CALL    BDOS        ;..DMA ADDR.
  1301. ;
  1302.     RET
  1303. ;
  1304. WRERR:    MOV    CL,CAN      ;CANCEL..
  1305.     CALL    SEND        ;..SENDER
  1306.     MOV    DX,OFFSET MSG24
  1307.     CALL    ERXIT       ;EXIT W/MSG:
  1308. WRSECT  ENDP
  1309. ;
  1310. ;---->    RECV: RECEIVE A CHARACTER
  1311. ;
  1312. ;TIMEOUT TIME IS IN B, IN SECONDS.  ENTRY VIA
  1313. ;"RECVDG" DELETES GARBAGE CHARACTERS ON THE
  1314. ;LINE.  FOR EXAMPLE, HAVING JUST SENT A SECTOR,
  1315. ;CALLING RECVDG WILL DELETE ANY LINE-NOISE-INDUCED
  1316. ;CHARACTERS "LONG" BEFORE THE ACK/NAK WOULD
  1317. ;BE RECEIVED.
  1318. ;
  1319. RECCHAR PROC    NEAR
  1320. RECVDG    LABEL    NEAR        ;RECEIVE W/GARBAGE DELETE
  1321.     PUSH    DX
  1322.     MOV    DX,MODDATP
  1323.     IN    AL,DX       ;GET A CHAR
  1324.     IN    AL,DX       ;..TOTALLY PURGE UART
  1325.     POP    DX
  1326. ;
  1327. RECV:    PUSH    DX          ;SAVE
  1328. ;
  1329.     IF    FASTCLK     ;4MHZ?
  1330.     MOV    AL,CH       ;GET TIME REQUEST
  1331.     ADD    AL,AL       ;DOUBLE IT
  1332.     MOV    CH,AL       ;NEW TIME IN B
  1333.     ENDIF
  1334. ;
  1335. MSEC:    MOV    DX,50000    ;1 SEC DCR COUNT
  1336.     CALL    CKABORT     ;CHECK FOR EXIT REQUEST
  1337. MWTI:    PUSH    DX
  1338.     MOV    DX,MODCTLP
  1339.     IN    AL,DX       ;CHECK STATUS
  1340.     POP    DX
  1341.     AND    AL,MODRCVB    ;ISOLATE BIT
  1342.     CMP    AL,MODRCVR    ;READY?
  1343.     JNZ    L00080
  1344.     JMP    MCHAR       ;GOT CHAR
  1345. L00080:    DEC    DL          ;COUNT..
  1346.     JZ    L00081
  1347.     JMP    MWTI        ;..DOWN..
  1348. L00081:    DEC    DH          ;..FOR..
  1349.     JZ    L00082
  1350.     JMP    MWTI        ;..TIMEOUT
  1351. L00082:    DEC    CH          ;MORE SECONDS?
  1352.     JZ    L00083
  1353.     JMP    MSEC        ;YES, WAIT
  1354. ;
  1355. ;MODEM TIMED OUT RECEIVING
  1356. ;
  1357. L00083:    POP    DX          ;RESTORE D,E
  1358.     STC                 ;CARRY SHOWS TIMEOUT
  1359.     RET
  1360. ;
  1361. ;GOT CHAR FROM MODEM
  1362. ;
  1363. MCHAR:    PUSH    DX
  1364.     MOV    DX,MODDATP
  1365.     IN    AL,DX       ;READ THE CHAR
  1366.     POP    DX
  1367.     POP    DX          ;RESTORE DE
  1368. ;
  1369. ;CALC CHECKSUM
  1370. ;
  1371.     LAHF
  1372.     XCHG    AL,AH
  1373.     PUSH    AX
  1374.     XCHG    AL,AH       ;SAVE THE CHAR
  1375.     ADD    AL,CL       ;ADD TO CHECKSUM
  1376.     MOV    CL,AL       ;SAVE CHECKSUM
  1377. ;
  1378. ;CHECK IF MONITORING REC'D DATA
  1379. ;
  1380.     MOV    AL,RSEEFLG    ;SEE RECEIVED..
  1381.     OR    AL,AL       ;..DATA?
  1382.     JNZ    L00084
  1383.     JMP    MONIN       ;..YES
  1384. ;
  1385. ;CHECK IF "VIEWING" AND THIS IS A DATA CHAR
  1386. ;
  1387. L00084:    MOV    AL,VSEEFLG    ;VIEWING..
  1388.     OR    AL,AL       ;..DATA?
  1389.     JZ    L00085
  1390.     JMP    NOMONIN     ;..NO
  1391. ;
  1392. ;"VIEW" REQUESTED.  SHOW THE CHAR IT IS DATA
  1393. ;
  1394. L00085:    MOV    AL,DATAFLG    ;GET DATA FLAG
  1395.     OR    AL,AL       ;TEST IT
  1396.     JNZ    MONIN  
  1397.     JMP    NOMONIN     ;..OFF, NOT DATA
  1398. MONIN:    POP    AX
  1399.     XCHG    AL,AH
  1400.     SAHF                ;..IS DATA,
  1401.     LAHF
  1402.     XCHG    AL,AH
  1403.     PUSH    AX
  1404.     XCHG    AL,AH       ;GET IT,
  1405.     CALL    SHOW        ;..AND SHOW IT
  1406. NOMONIN:
  1407.     POP    AX
  1408.     XCHG    AL,AH
  1409.     SAHF                ;RESTORE CHAR
  1410.     OR    AL,AL       ;CARRY OFF: NO ERROR
  1411.     RET                 ;FROM "RECV"
  1412. RECCHAR    ENDP
  1413. ;
  1414. ;---->    SEND: SEND A CHARACTER TO THE MODEM
  1415. ;
  1416. SEND    PROC    NEAR
  1417.          LAHF
  1418.     XCHG    AL,AH
  1419.     PUSH    AX
  1420.     XCHG    AL,AH       ;SAVE THE CHAR
  1421. ;
  1422. ;CHECK IF MONITORING SENT DATA
  1423. ;
  1424.     MOV    AL,SSEEFLG    ;CHECK IF MONITORING..
  1425.     OR    AL,AL       ;..SENT DATA
  1426.     JNZ    L00087
  1427.     JMP    MONOUT      ;..YES
  1428. ;
  1429. ;CHECK IF "VIEWING" THE FILE
  1430. ;
  1431. L00087:    MOV    AL,VSEEFLG    ;GET VIEW FLAG
  1432.     OR    AL,AL       ;TEST IT
  1433.     JZ    L00088
  1434.     JMP    NOMONOT     ;NO
  1435. L00088:    MOV    AL,DATAFLG    ;IS THIS
  1436.     OR    AL,AL       ;..DATA?
  1437.     JNZ    MONOUT 
  1438.     JMP    NOMONOT     ;..NO.
  1439. MONOUT:    POP    AX
  1440.     XCHG    AL,AH
  1441.     SAHF                ;GET THE CHAR
  1442.     LAHF
  1443.     XCHG    AL,AH
  1444.     PUSH    AX
  1445.     XCHG    AL,AH       ;SAVE IT
  1446.     CALL    SHOW        ;SHOW IT
  1447. NOMONOT:
  1448.         POP    AX
  1449.     XCHG    AL,AH
  1450.     SAHF                ;RESTORE CHAR
  1451.     LAHF
  1452.     XCHG    AL,AH
  1453.     PUSH    AX
  1454.     XCHG    AL,AH       ;SAVE IT
  1455.     ADD    AL,CL       ;CALC CKSUM
  1456.     MOV    CL,AL       ;SAVE CKSUM
  1457. SENDW:    PUSH    DX
  1458.     MOV    DX,MODCTLP
  1459.     IN    AL,DX       ;GET STATUS
  1460.     POP    DX
  1461.     AND    AL,MODSNDB    ;ISOLATE READY BIT
  1462.     CMP    AL,MODSNDR    ;READY?
  1463.     JZ    L00090
  1464.     JMP    SENDW       ;..NO, WAIT
  1465. L00090:    POP    AX
  1466.     XCHG    AL,AH
  1467.     SAHF                ;GET CHAR
  1468.     PUSH    DX
  1469.     MOV    DX,MODDATP
  1470.     OUT    DX,AL       ;OUTPUT IT
  1471.     POP    DX
  1472.     RET                 ;FROM "SEND"
  1473. SEND    ENDP
  1474. ;
  1475. ;---->    WAITNAK: WAITS FOR INITIAL NAK
  1476. ;
  1477. ;TO ENSURE NO DATA IS SENT UNTIL THE RECEIVING
  1478. ;PROGRAM IS READY, THIS ROUTINE WAITS FOR THE
  1479. ;THE FIRST TIMEOUT-NAK FROM THE RECEIVER.  (E)
  1480. ;CONTAINS THE # OF SECONDS TO WAIT.
  1481. ;
  1482. WAITNAK PROC    NEAR
  1483.     MOV    AL,VSEEFLG    ;VIEWING?
  1484.     OR    AL,AL
  1485.     JNZ    L00091
  1486.     JMP    WAITNPR     ;PRINT MSG
  1487. L00091:    MOV    AL,QFLG     ;QUIET..
  1488.     OR    AL,AL       ;..MODE?
  1489.     JNZ    WAITNPR
  1490.     JMP    WAITNLP     ;YES, SKIP MSG
  1491. WAITNPR LABEL    NEAR
  1492.     PUSH    BX
  1493.     MOV    BX,OFFSET MSG13
  1494.     CALL    ILPRT       ;PRINT:
  1495.     POP    BX
  1496. WAITNLP LABEL    NEAR
  1497.     CALL    CKABORT     ;ABORT IF LOCAL CTL-X
  1498.     MOV    CH,1        ;TIMEOUT DELAY
  1499.     CALL    RECV        ;DID WE GET..
  1500.     CMP    AL,NAK      ;..A NAK?
  1501.     JNZ    L00093
  1502.     RET                 ;YES, SEND BLOCK
  1503. ;
  1504. L00093  LABEL    NEAR
  1505.     IF CANFLG
  1506.     CMP    AL,CAN      ;CTL-X FROM REMOTE?
  1507.     JNZ    L00094
  1508.     JMP    ABORT       ;..YES, ABORT
  1509. L00094  LABEL    NEAR
  1510.     ENDIF
  1511. ;
  1512.     DEC    DL          ;80 TRIES?
  1513.     JNZ    L00095
  1514.     JMP    ABORT       ;YES, ABORT
  1515. L00095:    JMP    WAITNLP     ;NO, LOOP
  1516. WAITNAK    ENDP
  1517. ;
  1518. ;
  1519. ;---->    PROCOPT: PROCESS COMMAND OPTIONS
  1520. ;1) SAVES THE PRIMARY OPTION IN 'OPTION';
  1521. ;2) IF OPTION 'H' (HELP) IS ASKED FOR,
  1522. ;TRANSFERS DIRECTLY TO THE HELP PRINT;
  1523. ;3) SCANS THE SUB-OPTION CHARACTERS, AND FOR
  1524. ;EACH FOUND, ZEROS THE APPROPRIATE ENTRY IN
  1525. ;THE OPTION TABLE.  FOR EXAMPLE, IF 'D' IS 
  1526. ;CODED (DISCONNECT) THEN THE 'D' STORED AT
  1527. ;'DISCFLG' IS SET TO 0 SO IT CAN BE TESTED
  1528. ;LATER.
  1529. ;
  1530. PROCOPT PROC    NEAR
  1531.         MOV    DX,OFFSET FCBNAME ;TO PRIMARY OPT.
  1532.     XCHG    BX,DX
  1533.     MOV    AL,ES:[BX]      ;GET PRIMARY OPT.
  1534.        XCHG    BX,DX                   
  1535.     MOV       OPTION,AL    ;SAVE IT
  1536.         CMP     AL,'X'        ;MODEM EXAMPLES?
  1537.         JNZ    L00096
  1538.     JMP    EXAM        ;..YES, GIVE EXAMPLES
  1539. L00096:    CMP    AL,'H'      ;MODEM H(ELP)?
  1540.     JNZ    OPTLP  
  1541.     JMP    HELP        ;..YES, GIVE HELP
  1542. OPTLP:    PUSHF
  1543.     INC    DX              ;TO SECONDARY OPTION
  1544.     POPF                                    
  1545.     XCHG    BX,DX
  1546.     MOV    AL,ES:[BX]      ;GET CHAR
  1547.     XCHG    BX,DX                  
  1548. ;
  1549. ;IF YOU MOD THIS PROGRAM FOR >7 OPTIONS,
  1550. ;YOU MUST CHANGE THE FOLLOWING, SINCE
  1551. ;THERE WON'T BE A ' ' AFTER THE OPTION
  1552. ;IF A BAUD RATE WAS SPECIFIED.
  1553. ;
  1554.     CMP    AL,' '      ;NO MORE OPT'NS?
  1555.     JNZ    L00097
  1556.     JMP    ENDOPT      ;..YES
  1557. ;SET THE APPROP. OPT: STORE 0 IN IT
  1558. L00097:    MOV    BX,OFFSET OPTBL    ;HL = ADDR OF 'OAQDSRV'
  1559.     MOV    CX,TABLESIZE    ;OPT TABLE LEN
  1560. OPTCK:    CMP    AL,BYTE PTR [BX] ;FOUND THE OPTION?
  1561.     JZ    L00098
  1562.     JMP    OPTNO       ;NO, DON'T SET IT
  1563. L00098:    MOV    BYTE PTR [BX],0    ;SET THE OPTION
  1564.     JMP    OPTLP       ;GET NEXT OPTION
  1565. OPTNO:    PUSHF
  1566.     INC    BX
  1567.     POPF                ;TO NEXT
  1568.     DEC    CX          ;MORE?
  1569.     JZ    L00099
  1570.     JMP    OPTCK
  1571. ;OPTION NOT IN TABLE
  1572. L00099:    JMP    BADOPT      ;SHOW BAD SUB OPTION
  1573. ;
  1574. ;IF "VIEW" WAS ASKED FOR, SET QUIET FLAG
  1575. ;
  1576. ENDOPT:    MOV    AL,VSEEFLG    ;VIEW..
  1577.     OR    AL,AL       ;..ASKED FOR?
  1578.     JZ    L00100
  1579.     RET                 ;..NO, RET FROM 'PROCOPT'
  1580. L00100:    MOV       QFLG,AL     ;YES, NO HDR/CKSUM PRT
  1581.     RET                 ;FROM 'PROCOPT'
  1582. PROCOPT ENDP
  1583. ;
  1584. ;DONE - CLOSE UP SHOP
  1585. ;
  1586. DONE    PROC    NEAR
  1587.          MOV    AL,VSEEFLG    ;VIEWING?
  1588.     OR    AL,AL
  1589.     JNZ    L00101
  1590.     JMP    DONETC      ;SHOW MSG
  1591. L00101:    MOV    AL,QFLG     ;QUIET
  1592.     OR    AL,AL       ;..MODE?
  1593.     JNZ    DONETC 
  1594.     JMP    DONECTE     ;YES, CK TERM/ECHO
  1595. DONETC:    PUSH    BX
  1596.     MOV    BX,OFFSET MSG14
  1597.     CALL    ILPRT
  1598.     POP    BX
  1599. ;
  1600. ;CHECK IF TERMINAL OR ECHO SUB COMMAND
  1601. ;WAS SPECIFIED
  1602. ;
  1603. DONECTE:
  1604.     MOV    AL,TERMFLG    ;TERM?
  1605.     OR    AL,AL
  1606.     JNZ    L00103
  1607.     JMP    TERM        ;..YES
  1608. L00103:    MOV    AL,ECHOFLG    ;ECHO?
  1609.     OR    AL,AL
  1610.     JNZ    CKDIS 
  1611.     JMP    TRMECHO     ;..YES
  1612. ;
  1613. ;FALL INTO 'CKDIS'
  1614. ;
  1615. ;---->    CKDIS: CHECK IF DISCONNECT REQUESTED
  1616. ;
  1617. ;THIS ROUTINE IS JUMPED TO AT THE END OF
  1618. ;PROCESSING, AND DISCONNECTS THE PHONE IF
  1619. ;'D' WAS SPECIFIED AS A SUB-OPTION.
  1620. ;
  1621. CKDIS:    MOV    AL,DISCFLG    ;CHECK 'D' FLAG
  1622.     OR    AL,AL       ;REQUESTED?
  1623. ;                                                    x d x
  1624. ;    IF    NOT PMMI                             x e x
  1625. ;    JZ    L00106                               x l x
  1626. ;    JMP    EXIT                                 x e x
  1627. ;L00106  LABEL    NEAR                                 x t x
  1628. ;    ENDIF                                        x e x
  1629. ;                                                    x d x
  1630. ;AWAIT C/R TO DISC. SO WE DON'T LOSE THE PHONE            
  1631. ;
  1632.     PUSH    BX
  1633.     MOV    BX,OFFSET MSG15
  1634.     CALL    ILPRT
  1635.     POP    BX
  1636.     CALL    KEYIN
  1637.     LAHF
  1638.     XCHG    AL,AH
  1639.     PUSH    AX
  1640.     XCHG    AL,AH
  1641.     CALL    CRLF
  1642.     POP    AX
  1643.     XCHG    AL,AH
  1644.     SAHF    
  1645.     CMP    AL,0DH
  1646.     JZ    DISCONN
  1647.     JMP    CKDIS               ;ASK AGAIN
  1648. ;
  1649. ;---->    DISCONN: DISCONNECT THE PHONE
  1650. ;
  1651. DISCONN LABEL    NEAR
  1652.         PUSH    BX
  1653.     MOV    BX,OFFSET MSG16
  1654.     CALL    ILPRT               ;PRINT:
  1655.     POP    BX
  1656.     JMP    EXIT
  1657. DONE    ENDP
  1658. ;
  1659. ;NO DISCONNECT, TYPEZZ MSG AS REMINDER THAT PHONE'S
  1660. ;ON HOOK
  1661. ;
  1662. ;
  1663. ;---->    INITMOD: INITIALIZED THE MODEM
  1664. ;
  1665. ;THIS ROUTINE IS USED TO INITIALIZE SERIAL
  1666. ;PORT USED BY THE PROGRAM.  IT INCLUDES SUPPORT FOR 
  1667. ;SELECTING WHICH OF THE THREE UARTS SUPPORTED BY THE IBM/PC 
  1668. ;ARCHITECTURE WILL BE USED FOR THIS TRANSMISSION
  1669. ;
  1670. ;
  1671. ;
  1672. INITMOD PROC    NEAR
  1673. ;
  1674. ;    ONLY THE "dtr up" PORTION OF THIS MODEM INITIALIZATION,
  1675. ;    [and THE PORT SELECTION]
  1676. ;    IS STATIC -- ALL OTHER PORT SETUP IS DONE EXTERNALLY, OR BY
  1677. ;    THE "I" SECONDARY OPTION - WHICH DEFAULTS THE COMx PORT
  1678. ;    TO 300 baud, 8 bits, 1stop bit, AND  n o  parity
  1679. ;
  1680.     MOV    BX,BASE1U        ;POINT TO A UART
  1681.     XOR    AX,AX
  1682.     CMP    AL,URT3FLG        ;IS 3 REQUESTED (flags zeroed if found)
  1683.     JNE    INIT1                   ;CONTINUE IF NOT
  1684.     MOV    BX,BASE3U               ;IF YES, POINT TO 3
  1685.     JMP    INIT2                   ; AND DO PORT SETUP
  1686. INIT1:    CMP    AL,URT2FLG             ;IS 2 REQUESTED
  1687.     JNE    INIT2                   ;DEFAULT TO ONE IF NOT
  1688.     MOV    BX,BASE2U        ;OR POINT TO TWO  AND
  1689. ;                    ; DO THE PORT POINTER SETUP
  1690. ;
  1691. ;    SETUP POINTERS TO THE UART PORTS     (SUPPORTS 3)
  1692. ;
  1693. INIT2:    MOV    AX,BX            ;BUILD 
  1694.     ADD    AX,OFFDATP        ;
  1695.     MOV    MODDATP,AX              ;     MODDATP
  1696.     MOV    AX,BX                   ;BUILD
  1697.     ADD    AX,OFFCTLP              ;
  1698.     MOV    MODCTLP,AX              ;MSR  MODCTLP
  1699.     MOV    AX,BX            ;BUILD 
  1700.     ADD    AX,OFFCTL2        ;
  1701.     MOV    MODCTL2,AX              ;MCR  MODCTL2
  1702.     MOV    AX,BX                   ;BUILD
  1703.     ADD    AX,OFFCTL3              ;
  1704.     MOV    MODCTL3,AX              ;LCR  MODCTL3    
  1705. ;
  1706. ;
  1707. ;    NOW THAT A PORT [COM1 COM2 or COM3] IS SELECTED
  1708. ;        put up dtr FOR POOR FOLKS WITH 
  1709. ;        COMMERCIAL MODEMS THAT REQUIRE IT.
  1710. ;        (poor folks, of course, is a relative term)
  1711. ;
  1712. ;                                       ; 
  1713.     MOV    AL,DTREADY              ;OUTPUT DTR UP
  1714.     PUSH    DX                      ;  REQUEST TO
  1715.     MOV    DX,MODCTL2              ;MODEM CONTROL REGISTER
  1716.     OUT    DX,AL            ;
  1717. ;
  1718. ;    check for uart init request -- set COMx TO 300,N,8,1 IF 0
  1719. ;
  1720.     MOV    al,DUMYFLG
  1721.     or    al,al
  1722.     jnz    noinit
  1723.         push    dx
  1724.     mov    dx,3fbh
  1725.     mov    al,80h
  1726.     out    dx,al
  1727.     mov    dx,3f9h
  1728.     mov    al,01h
  1729.     out    dx,al
  1730.     mov    dx,3f8h
  1731.     mov    al,80h
  1732.     out    dx,al
  1733.     mov    dx,3fbh
  1734.     mov    al,03h
  1735.     out    dx,al
  1736. ;
  1737. ;    the above sequence defaults the modem to 300,n,8,1 .. 
  1738. ;
  1739. NOINIT: POP    DX        ;RESTORE DX BEFORE LEAVING
  1740.            RET
  1741. INITMOD    ENDP
  1742. ;
  1743. ;---->    MOVEFCB: MOVES FCB(2) TO FCB
  1744. ;
  1745. ;I ATTEMPTED TO MAKE THE MODEM COMMAND 'NATURAL',
  1746. ;I.E. MODEM SEND FILENAME (MODEM S FN.FT) RATHER
  1747. ;THAT MODEM FILENAME SEND (MODEM FN.FT S) SO THIS
  1748. ;ROUTINE MOVES THE FILENAME FROM THE SECOND FCB
  1749. ;TO THE FIRST
  1750. ;
  1751. MOVEFCB PROC    NEAR
  1752.     MOV    BX,OFFSET FCB2  ;FROM
  1753.     MOV    DX,OFFSET FCB   ;TO
  1754.     MOV    CH,16           ;LEN
  1755.         PUSH    DS        ;SAVE DS
  1756.         PUSH    ES        ;MOVE ES ...
  1757.         POP    DS        ;... TO DS
  1758.     CALL    MOVE            ;DO THE MOVE
  1759.     POP    DS        ;RESTORE DS    
  1760.     XOR    AL,AL           ;GET 0
  1761.     MOV       FCBCR,AL        ;ZERO CURRENT RECORD
  1762.     MOV      FCBRR,AL        ;..AND RANDOM RECORD
  1763.     RET         
  1764. MOVEFCB    ENDP
  1765. ;
  1766. ;---->    SHOW: SHOWS CHAR SENT/RECEIVED
  1767. ;
  1768. ;CR, LF, AND TAB ARE SHOWN.  ALL OTHER
  1769. ;NON-PRINTABLE CHARACTERS ARE SHOWN IN
  1770. ;HEX AS (XX)
  1771. ;
  1772. SHOW    PROC    NEAR
  1773.          CMP    AL,LF       ;LF?
  1774.     JNZ    L00122
  1775.     JMP    CTYPEZZ     ;..YES, TYPEZZ IT
  1776. L00122:    CMP    AL,CR       ;CR?
  1777.     JNZ    L00123
  1778.     JMP    CTYPEZZ     ;..YES, TYPEZZ IT
  1779. L00123:    CMP    AL,09       ;TAB
  1780.     JNZ    L00124
  1781.     JMP    CTYPEZZ     ;..YES, TYPEZZ IT
  1782. L00124:    CMP    AL,' '      ;CTL-CHR?
  1783.     JAE    L00125
  1784.     JMP    SHOWHEX     ;YES, SHOW IN HEX
  1785. L00125:    CMP    AL,7FH      ;DEL?
  1786.     JAE    SHOWHEX
  1787.     JMP    CTYPEZZ     ;NO, TYPEZZ THE CHAR
  1788. SHOWHEX LABEL    NEAR
  1789.     LAHF
  1790.     XCHG    AL,AH
  1791.     PUSH    AX
  1792.     XCHG    AL,AH       ;SAVE THE CHAR
  1793.     MOV    AL,'('      ;TYPEZZ..
  1794.     CALL    CTYPEZZ     ;..'('
  1795.     POP    AX
  1796.     XCHG    AL,AH
  1797.     SAHF                ;THEN..
  1798.     CALL    HEXO        ;..THE CHAR
  1799.     MOV    AL,')'      ;THEN..
  1800.     JMP    CTYPEZZ     ;..')' AND RETURN.
  1801. ;
  1802. ;---->    CTYPEZZ: TYPEZZS VIA CP/M SO TABS ARE EXPANDED
  1803. ;
  1804. CTYPEZZ LABEL   NEAR
  1805.     PUSH    CX          ;SAVE..
  1806.     PUSH    DX          ;..ALL..
  1807.     PUSH    BX          ;..REGS
  1808.     MOV    DL,AL       ;CHAR TO E
  1809.     MOV    CL,WRCON    ;GET BDOS FNC
  1810.     CALL    BDOS        ;PRIN THE CHR
  1811.     POP    BX          ;RESTORE..
  1812.     POP    DX          ;..ALL..
  1813.     POP    CX          ;..REGS
  1814.     RET                 ;FROM "CTYPEZZ"
  1815. SHOW    ENDP
  1816. ;
  1817. CRLF    PROC    NEAR
  1818.          MOV    AL,CR
  1819.     CALL    TYPEZZ
  1820.     MOV    AL,LF
  1821. CRLF    ENDP
  1822. ;
  1823. ;---->    TYPEZZ: TYPEZZ VIA DIRECT BDOS ACCESS
  1824. ;
  1825. ;THIS ROUTINE BYPASSES CP/M'S CTL-S, CTL-C
  1826. ;TESTS.
  1827. ;
  1828. TYPEZZ    PROC    NEAR
  1829.            LAHF
  1830.     XCHG    AL,AH
  1831.     PUSH    AX
  1832.     XCHG    AL,AH       ;SAVE CHAR
  1833.     PUSH    CX          ;AND B
  1834. VTYPEZZ LABEL   NEAR
  1835.     MOV    CL,DCON        ;GET BDOS FNC
  1836.     MOV    DL,AL
  1837.     CALL    BDOS
  1838.     POP    CX
  1839.     POP    AX
  1840.     XCHG    AL,AH
  1841.     SAHF
  1842.     RET                 ;FROM "TYPEZZ"
  1843. TYPEZZ    ENDP
  1844. ;
  1845. ;KEYBOARD STATUS
  1846. ;
  1847. ;    This routine has been changed from CP/M-86: the service for
  1848. ;    MS-DOS differs in several respects.. [CP/M version uses
  1849. ;    x'FE' in DL and calls "DCON" which isn't supported
  1850. ;    in MSDOS .. SO we use the CONSOLE STATUS service.
  1851. ;
  1852. STAT    PROC    NEAR
  1853.          MOV    CL,CONST     ;GET BDOS FNC 
  1854. ;    MOV    DL,0FfH         ;**Conventions changed from CP/M !!!
  1855.     CALL    BDOS
  1856.      OR    AL,AL       ;0 => NOT READY
  1857. ;                ;AL = FF if char ready: else =00         
  1858.     RET
  1859. STAT    ENDP
  1860. ;
  1861. ;KEYBOARD INPUT
  1862. ;
  1863. ;    This routine should be changed to use direct BIOS interface.
  1864. ;    with the current BDOS call [DCON = 6] the CTRL-BREAK and
  1865. ;    CTRL-C sequences are intercepted and interpreted as 
  1866. ;    termination requests
  1867. ;
  1868. ;
  1869. ;
  1870. KEYIN    PROC    NEAR
  1871.           MOV    CL,DCON        ;GET BDOS FNC
  1872.     MOV    DL,0FFH
  1873.     CALL    BDOS
  1874.     JZ    KEYIN        ;ZERO FLAG SET IF NO CHARACTER 
  1875.     CMP    AL,CTLCCHR
  1876.     JNE    KEY001
  1877.     MOV    AL,CTLCHAR
  1878.     ret            ;return if ctl-c to be sent
  1879. ;
  1880. ;    SPECIAL FUNCTION KEY SUPPORT 
  1881. ;                                     **ALT-C ==> transmits CTRL-C
  1882. ;    Support will be added here for 
  1883. ;    use of ALT-? keyins for shuch things as BAUD rate shift,
  1884. ;    mode changes (quiet/noisy On/Off of R,S,Q secondary optns.)
  1885. ;
  1886. ;
  1887. key001:    cmp    al,0
  1888.     je    altkey
  1889.     RET            ;return if not "00" for special function code
  1890. altkey:    mov    cl,dcon        ;set bdos function
  1891.     mov    dl,0ffh        ;ask for character
  1892.     call    bdos
  1893.     jz    altkey        ;spin until second code
  1894. ;    if we got here it should be a special scan code
  1895. ;
  1896.     cmp    al,46           ;replace
  1897.     jne    akey01          ;       ALT-C
  1898.     mov    al,ctlchar      ;  WITH
  1899.     ret                     ;       CTRL-C
  1900. AKEY01:    CMP    AL,59
  1901.     JNL    AKEY02
  1902.     RET
  1903. AKEY02:    CMP    AL,68
  1904.     JL    AKEY03
  1905.     RET
  1906. AKEY03:    NOP
  1907.     NOP
  1908.     RET
  1909. KEYIN     ENDP
  1910. ;
  1911. ;HEX OUTPUT
  1912. ;
  1913. HEXO    PROC    NEAR
  1914.          LAHF
  1915.     XCHG    AL,AH
  1916.     PUSH    AX
  1917.     XCHG    AL,AH       ;SAVE FOR RIGHT DIGIT
  1918.     RCR    AL,1        ;RIGHT..
  1919.     RCR    AL,1        ;..JUSTIFY..
  1920.     RCR    AL,1        ;..LEFT..
  1921.     RCR    AL,1        ;..DIGIT..
  1922.     CALL    NIBBL       ;PRINT LEFT DIGIT
  1923.     POP    AX
  1924.     XCHG    AL,AH
  1925.     SAHF                ;RESTORE RIGHT
  1926. NIBBL:    AND    AL,0FH      ;ISOLATE DIGIT
  1927.     CMP    AL,10       ;IS IS <10?
  1928.     JAE    L00127
  1929.     JMP    ISNUM       ;YES, NOT ALPHA
  1930. L00127:    ADD    AL,7        ;ADD ALPHA BIAS
  1931. ISNUM:    ADD    AL,'0'      ;MAKE PRINTABLE
  1932.     JMP    TYPEZZ      ;..THEN TYPEZZ IT
  1933. HEXO    ENDP
  1934. ;
  1935. ;---->    CKQUIT: QUIT/RETRY AFTER MULTIPLE ERRS.
  1936. ;
  1937. ;RETURNS W/ ZERO SET IF "RETRY" ASKED FOR
  1938. ;
  1939. CKQUIT    PROC    NEAR
  1940.            XOR    AL,AL       ;ZERO..
  1941.     MOV       ERRCT,AL    ;..ERROR COUNT
  1942.     PUSH    BX
  1943.     MOV    BX,OFFSET MSG18
  1944.     CALL    ILPRT       ;PRINT:
  1945.     POP    BX
  1946.     CALL    KEYIN       ;QUIT/RETRY
  1947.     LAHF
  1948.     XCHG    AL,AH
  1949.     PUSH    AX
  1950.     XCHG    AL,AH
  1951.     CALL    CRLF
  1952.     POP    AX
  1953.     XCHG    AL,AH
  1954.     SAHF    
  1955.     AND    AL,5FH      ;MAKE UPPER CASE
  1956.     CMP    AL,'R'      ;RETRY?
  1957.     JNZ    L00128
  1958.     RET                 ;'KEEP ON TRUCKIN'
  1959. L00128:    CMP    AL,'Q'      ;QUIT?
  1960.     JZ    L00129
  1961.     JMP    CKQUIT      ;NO, ASK AGAIN
  1962. L00129:    OR    AL,AL       ;SET NON-ZERO
  1963.     RET
  1964. CKQUIT    ENDP
  1965. ;
  1966. ;---->    ILPRT: INLINE PRINT OF MSG
  1967. ;
  1968. ;THE CALL TO ILPRT IS FOLLOWED BY A MESSAGE,
  1969. ;BINARY 0 AS THE END.  BINARY 1 MAY BE USED TO
  1970. ;PAUSE (MESSAGE 'PRESS RETURN TO CONTINUE')
  1971. ;
  1972. ILPRT     PROC    NEAR
  1973. ILPLP:    MOV    AL,BYTE PTR[BX]
  1974.     OR    AL,AL           ;END OF MSG?
  1975.     JNZ    L00130
  1976.     JMP    ILPRET          ;..YES, RETURN
  1977. L00130:    CMP    AL,1            ;PAUSE?
  1978.     JNZ    L00131
  1979.     JMP    ILPAUSE         ;..YES
  1980. L00131:    CALL    CTYPEZZ         ;TYPEZZ THE MSG
  1981. ILPNEXT:
  1982.         PUSHF
  1983.     INC    BX
  1984.     POPF                    ;TO NEXT CHAR
  1985.     JMP    ILPLP           ;LOOP
  1986. ;
  1987. ;PAUSE WHILE TYPING HELP SO INFO DOESN'T
  1988. ;    SCROLL OFF OF VIDEO SCREENS
  1989. ;
  1990. ILPAUSE:
  1991.     PUSH    BX
  1992.     MOV    BX,OFFSET MSG19
  1993.     CALL    ILPRT           ;PRINT:
  1994.     POP    BX
  1995.     CALL    KEYIN           ;GET ANY CHAR
  1996.     CMP    AL,'C'-40H      ;REBOOT?
  1997.     JNZ     L09132        ;EXIT IF QUITCHAR
  1998.     JMP    EXIT
  1999. L09132:    CMP    AL,'I'-40H    ;ALT REBOOT?
  2000.     JNZ    L00132        ;
  2001.     JMP    EXIT            ;YES.
  2002. L00132:    JMP    ILPNEXT         ;LOOP
  2003. ILPRET:    RET                     ;PAST MSG
  2004. ILPRT    ENDP
  2005. ;
  2006. ;---->    PRTMSG: PRINTS MSG POINTED TO BY (DE)
  2007. ;
  2008. ;A '$' IS THE ENDING DELIMITER FOR THE PRINT.
  2009. ;NO REGISTERS SAVED.
  2010. ;
  2011. PRTMSG    PROC    NEAR
  2012.            MOV    CL,PRINT        ;GET BDOS FNC
  2013.     JMP    BDOS            ;PRINT MESSAGE, RETURN
  2014. PRTMSG    ENDP
  2015. ;
  2016. ;---->    ERXIT: EXIT PRINTING MSG FOLLOWING CALL
  2017. ;
  2018. ERXIT    PROC    NEAR
  2019.           POP    BX              ;GET MESSAGE
  2020.     CALL    PRTMSG          ;PRINT IT
  2021.     CALL    CKDIS           ;DISCONNECT?
  2022.     JMP     EXIT            ;RETURN TO PC DOS       
  2023. ERXIT    ENDP
  2024. ;
  2025. ;MOVE 128 CHARACTERS
  2026. ;
  2027. MOVE128 PROC      NEAR
  2028.     MOV    CH,128          ;SET MOVE COUNT
  2029. ;
  2030. ;MOVE FROM (HL) TO (DE) LENGTH IN (B)
  2031. ;
  2032. MOVE:    MOV    AL,BYTE PTR [BX] ;GET A CHAR
  2033.     XCHG    BX,DX
  2034.     MOV    [BX],AL
  2035.     XCHG    BX,DX           ;STORE IT
  2036.     PUSHF
  2037.     INC    BX
  2038.     POPF                    ;TO NEXT "FROM"
  2039.     PUSHF
  2040.     INC    DX
  2041.     POPF                    ;TO NEXT "TO"
  2042.     DEC    CH              ;MORE?
  2043.     JZ    L00133
  2044.     JMP    MOVE            ;..YES, LOOP
  2045. L00133:    RET                     ;..NO, RETURN
  2046. MOVE128    ENDP
  2047. ;
  2048. BDOS    PROC    NEAR
  2049.          PUSH    BX                                                        
  2050.         PUSH    CX
  2051.     PUSH    DX
  2052.     MOV    AH,CL        ;MOVE FNC FOR PC DOS
  2053.     INT     21H            ;INVOKE PC DOS SERVICE        
  2054.     POP    DX
  2055.     POP    CX
  2056.     POP    BX
  2057.     RET
  2058. BDOS    ENDP
  2059. ;
  2060. BADOPT:    CALL    TYPEZZ
  2061.     PUSH    BX
  2062.     MOV    BX,OFFSET MSG25
  2063.     CALL    ILPRT
  2064.     POP    BX
  2065. HELP:    PUSH    BX
  2066.     MOV        BX,OFFSET MSG26
  2067.     CALL     ILPRT
  2068.     POP    BX
  2069.     JMP    copyrt
  2070. EXAM:    PUSH    BX
  2071.     MOV     BX,OFFSET MSG27
  2072.     CALL    ILPRT
  2073.     POP    BX
  2074.     JMP    copyrt
  2075. ;
  2076. ;  Print Limited license with "HELP" request output
  2077. ;
  2078. copyrt:    CALL    STAT
  2079. ;
  2080. ;    CLEAR THE SCREEN (cursor = 1,1)
  2081. ;
  2082.     SUB    CX,CX        ;UPPER LEFT CORNER
  2083.     MOV    DX,184FH    ;BOTTOM RIGHT CORNER
  2084.     MOV    BH,7        ;NORMAL ATTRIB FOR CLS
  2085.     SCROLL            ;INVOKE BIOS TO CLEAR SCREEN
  2086.     SUB    DX,DX        ;POINT TO ROW 1,COL 1
  2087.     LOCATE            ;SET THE CURSOR TO TOP LEFT
  2088. ;
  2089. ;    PRINT COPYRIGHT NOTICE  AND PAUSE 
  2090. ;
  2091.     mov    bx,offset msg00 ;point to copyright notice
  2092.     call    ilprt        ; go print it (PAUSE)
  2093. ;
  2094. ;    RETURN TO CALLER 
  2095. ;
  2096.     jmp    exit
  2097. ;
  2098. ;
  2099. ;
  2100. MODEM   ENDS
  2101.     SUBTTL    'MODIFICATION HISTORY AND CREDITS'
  2102.     PAGE
  2103. ;
  2104. ;* * * * * * * * * * * * * * * * * * * * * * * * *
  2105. ;*                         *
  2106. ;*   THIS PROGRAM DOCUMENTED IN "MODEM.DOC"     *
  2107. ;*                         *
  2108. ;* * * * * * * * * * * * * * * * * * * * * * * * *
  2109. ;* THIS PROGRAM WAS "MODEM.ASM" BUT and then was * 
  2110. ;* TEMPORARILY NAMED "MODEM2.ASM" SO PEOPLE     *
  2111. ;* WILL REALIZE IT IS AN ENHANCEMENT OF         *
  2112. ;* THE ORIGINAL PROGRAM "MODEM.ASM" ON CP/M     * 
  2113. ;* USER'S GROUP DISK 25.             *
  2114. ;* * * * * * * * * * * * * * * * * * * * * * * * *
  2115. ;
  2116. ;PLEASE PASS ON MODS, BUGS, ETC, SO YOUR
  2117. ;FIXES OR ENHANCEMENTS MAY BE SHARED BY ALL,
  2118. ;
  2119. ;Please send to the bottom name on the list,
  2120. ;    OR TO ALL OF US - if you can afford
  2121. ;              the time
  2122. ;
  2123. ;    Ward Christensen
  2124. ;    688 E. 154th St. #5D
  2125. ;    Dolton, Il. 60419
  2126. ;
  2127. ;    (312) 849-6279
  2128. ;
  2129. ;You may send a self-addressed stamped postcard
  2130. ;to be informed of changes/bugs as they become
  2131. ;known.     [CP/M Version]
  2132. ;
  2133. ;
  2134. ;
  2135. ;       05/08/82
  2136. ;Modified for CP/M 86 and the IBM PC 
  2137. ; by Randy Suess
  2138. ;    5219 Warwick
  2139. ;    Chicago, Ill 60641
  2140. ;    312-545 7535
  2141. ;
  2142. ;       06/03/82
  2143. ;Modified for PC DOS and the IBM PC
  2144. ;by Rick Mallinak
  2145. ;   22451 Franklin Dr.
  2146. ;   Richton Park, Ill 60471
  2147. ;   (312) 481-6459
  2148. ;
  2149. ;    08/11/82
  2150. ;Repaired for PC DOS 1.1 and IBM PC
  2151. ;by John Chapman
  2152. ;   844 S. Madison St.
  2153. ;   Hinsdale Illinois 60521
  2154. ;   (312) 325-3081
  2155. ;                 CS: 70205,1217
  2156. ;
  2157. ;  
  2158. ;
  2159. ;       --------------------
  2160. ;       MODIFICATION HISTORY
  2161. ;    --------------------
  2162. ;
  2163. ;    09/23/77
  2164. ;ORIGINALLY WRITTEN BY WARD CHRISTENSEN
  2165. ;
  2166. ;    04/26/79
  2167. ;REWRITTEN BY WARD CHRISTENSEN TO COMBINE
  2168. ;IMPROVEMENTS TO THE ORIGINAL MADE BY WARD
  2169. ;AND BY KEITH PETERSEN, W8SDZ, AND SUGGESTIONS
  2170. ;BY JIM BELL WHICH KEITH IMPLEMENTED.  SEE
  2171. ;MODEM.DOC FOR ADDITIONAL HISTORICAL
  2172. ;INFORMATION AND DOCUMENSATION.
  2173. ;
  2174. ;    05/09/79
  2175. ;ALLOW 'T' AND 'E' SUB-OPTIONS TO GO TO TERMINAL
  2176. ;OR ECHO MODEM AFTER TRANSFERRING A FILE.  (WLC)
  2177. ;
  2178. ;    05/22/79
  2179. ;ADD FEATURE TO MAKE RECEIVE FILE ROUTINE SAY
  2180. ;FILE SUCCESSFULLY OPENED, WHEN IN QUIET MODE.
  2181. ;MOVE INITIAL GOBBLE GARBAGE INPUTS TO BEFORE
  2182. ;COMMAND CPI'S SO ALL MODES ARE CLEARED. CHANGE
  2183. ;INITIAL SEND WAIT TO 80 SECS TO ALLOW MORE TIME
  2184. ;FOR RECEIVING END TO COME UP. ADD 'H' AFTER MSG
  2185. ;THAT SHOWS NUMBER OF SECTORS IN EXTENT ABOUT TO
  2186. ;BE SENT.  (KBP)
  2187. ;
  2188. ;    05/24/79
  2189. ;FIX MISSING RETURN INSTRUCTION AT END OF
  2190. ;INITIALIZATION ROUTINE.  (KBP)
  2191. ;
  2192. ;    07/13/79
  2193. ;PUT IN RESET OF DMA ADDR TO 80H AFTER
  2194. ;FILE RECEIVE, BECAUSE "SUBMIT" UNDER CP/M
  2195. ;DOESN'T RESET IT BEFORE READING THE
  2196. ;NEXT SUBMITTED COMMAND. /// ALSO DELETE
  2197. ;CODE FOR "CANCEL" AS IT'S JUST TOO EASY
  2198. ;TO INTENTIONALLY GET A CANCEL AS A
  2199. ;GARBAGED LINE CHARACTER.
  2200. ;
  2201. ;;
  2202. ;           05/82
  2203. ;    
  2204. ;Rewitten for CP/M-86 by Randy Suess
  2205. ; Changes mainly to interface with 
  2206. ; the CP/M-86 BDOS services 
  2207. ;
  2208. ;        06/82
  2209. ;
  2210. ;Randy's version altered by Rick Mallinak
  2211. ;to beacceptable to PC/DOS assembler.
  2212. ;Comments added and changes made to
  2213. ;support multiple segment version
  2214. ;
  2215. ;           08/82                      ********CURRENT VERSION***********
  2216. ;
  2217. ;Rick's PC/DOS version reworked
  2218. ;to: a) RUn as a .COM file by
  2219. ;returning to single segment image;
  2220. ;b)terminal bugs repaired,; c) code
  2221. ;added to 'bring up' DTR as program
  2222. ;starts up [necessary for non-autodial
  2223. ;commercial modems]; and c) both 
  2224. ;source and execution time messages 
  2225. ;added to prevent Resale or Commmercial
  2226. ;use of this program.
  2227. ;
  2228. ;
  2229. ;
  2230.     END     MAIN
  2231.  
  2232.